簡體   English   中英

子集 dataframe 與 R 中的特定條件

[英]Subset a dataframe with specific condition in 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

我們為什么不簡單地這樣做呢?

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,rest 將相同。

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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM