首页 > 解决方案 > 在 R 中对具有特定条件的数据框进行子集化

问题描述

你好我有这个df

        res1 res4 aa1234

    1     1    4   IVGG
    2    10   13   RQFP
    3   102  105   TSSV
    4   112  115   LQNA
    5   118  121   EAGT
    6    12   15   FPFL
    7   132  135   RSGG
    8   138  141   SRFP
    9   150  153   PEDQ
    10  151  154   EDQC
    11  155  158   RPNN
    12  165  168   TRRG
    13  171  174   CNGD
    14  172  175   NGDG
    15  174  177   DGGT
    16  181  184   CEGL
    17  195  198   PCGR
    18   20   23   NQGR
    19  205  208   RVAL
    20   32   35   HARF
    21   39   42   AASC
    22   40   43   ASCF
    23   48   51   PGVS
    24   57   60   AYDL
    25   59   62   DLRR
    26   64   67   ERQS
    27   65   68   RQSR
    28   78   81   ENGY
    29    8   11   RPRQ
    30   82   85   DPQQ
    31   83   86   PQQN
    32   86   89   NLND
    33   95   98   LDRE

我想将其子集化,仅考虑 res1 按 i 和 i <= i+4 顺序排列的行,如:

   res1 res4 aa1234
29    8   11   RPRQ
 6   12   15   FPFL
21   39   42   AASC
22   40   43   ASCF
24   57   60   AYDL
25   59   62   DLRR
26   64   67   ERQS
27   65   68   RQSR
28   78   81   ENGY
30   82   85   DPQQ
31   83   86   PQQN
32   86   89   NLND
9   150  153   PEDQ
10  151  154   EDQC
11  155  158   RPNN
13  171  174   CNGD
14  172  175   NGDG
15  174  177   DGGT

我尝试了一些具有“过滤器”和“子集”功能的东西,但没有得到预期的结果。

所以一般来说,我需要在一个范围(i-i+4)中的两行之间有重叠,包括 i+4。

例如,在这 3 行中,行 [9] 和 [10] 之间存在重叠(150-153 与 151-154 重叠),但行 [11] 对应于 res1[10] + 4 (151+4 = 155)。所以也许一个想法应该是考虑 res1[i] 并检查 res1[i+1] 是否 =< res[i]。

9   150  153   PEDQ
10  151  154   EDQC
11  155  158   RPNN

标签: rconditional-statementssubset

解决方案


我们为什么不简单地这样做呢?

df[df$res1 %in% c(df$res1 -4,df$res1 -3, df$res1-2,  df$res1 -1, df$res1+1,df$res1  +2, df$res1 +3, df$res1 +4),]

   res1 res4 aa1234
2    10   13   RQFP
6    12   15   FPFL
9   150  153   PEDQ
10  151  154   EDQC
11  155  158   RPNN
13  171  174   CNGD
14  172  175   NGDG
15  174  177   DGGT
21   39   42   AASC
22   40   43   ASCF
24   57   60   AYDL
25   59   62   DLRR
26   64   67   ERQS
27   65   68   RQSR
28   78   81   ENGY
29    8   11   RPRQ
30   82   85   DPQQ
31   83   86   PQQN
32   86   89   NLND

编辑后的场景只需订购 df,其余部分将相同。看

df <- df[order(df$res1),]
df[sort(unique(c(which(rev(diff(rev(df$res1))) >= -3 & rev(diff(rev(df$res1))) <= 0), which(diff(df$res1) <= 4 & diff(df$res1) >= 0)+1))),]

   res1 res4 aa1234
29    8   11   RPRQ
2    10   13   RQFP
6    12   15   FPFL
21   39   42   AASC
22   40   43   ASCF
24   57   60   AYDL
25   59   62   DLRR
26   64   67   ERQS
27   65   68   RQSR
30   82   85   DPQQ
31   83   86   PQQN
32   86   89   NLND
9   150  153   PEDQ
10  151  154   EDQC
11  155  158   RPNN
13  171  174   CNGD
14  172  175   NGDG
15  174  177   DGGT

旧答案使用这个

df[sort(unique(c(which(rev(diff(rev(df$res1))) >= -3 & rev(diff(rev(df$res1))) <= 0), which(diff(df$res1) <= 4 & diff(df$res1) >= 0)+1))),] 


   res1 res4 aa1234
9   150  153   PEDQ
10  151  154   EDQC
11  155  158   RPNN
13  171  174   CNGD
14  172  175   NGDG
15  174  177   DGGT
21   39   42   AASC
22   40   43   ASCF
24   57   60   AYDL
25   59   62   DLRR
26   64   67   ERQS
27   65   68   RQSR
30   82   85   DPQQ
31   83   86   PQQN
32   86   89   NLND

使用的数据

df <- read.table(text = "res1 res4 aa1234 
1 1 4 IVGG 
2 10 13 RQFP 
3 102 105 TSSV 
4 112 115 LQNA 
5 118 121 EAGT 
6 12 15 FPFL 
7 132 135 RSGG 
8 138 141 SRFP 
9 150 153 PEDQ 
10 151 154 EDQC 
11 155 158 RPNN 
12 165 168 TRRG 
13 171 174 CNGD 
14 172 175 NGDG 
15 174 177 DGGT 
16 181 184 CEGL 
17 195 198 PCGR 
18 20 23 NQGR 
19 205 208 RVAL 
20 32 35 HARF 
21 39 42 AASC 
22 40 43 ASCF 
23 48 51 PGVS 
24 57 60 AYDL 
25 59 62 DLRR 
26 64 67 ERQS 
27 65 68 RQSR 
28 78 81 ENGY 
29 8 11 RPRQ 
30 82 85 DPQQ 
31 83 86 PQQN 
32 86 89 NLND 
33 95 98 LDRE", header = T) 

推荐阅读