首页 > 解决方案 > R如何根据以下行中的条件过滤数据框?

问题描述

我有一个如下所示的数据框:

a<-c(1,1,-1,1,-1,1,-1,1,1,1,1)
b<-c(100,200,50,100,78,45,78,34,56,32,45)
c<-c(3,2,4,1,3,2,1,3,5,1,2)
d<-c(3400,3403,3407,3408,3412,3423,3436,3245,3234,3456,2345)
df<-cbind(a,b,c,d)
df
       a   b c    d
 [1,]  1 100 3 3400
 [2,]  1 200 2 3403
 [3,] -1  50 4 3407
 [4,]  1 100 1 3408
 [5,] -1  78 3 3412
 [6,]  1  45 2 3423
 [7,] -1  78 1 3436
 [8,]  1  34 3 3245
 [9,]  1  56 5 3234
[10,]  1  32 1 3456
[11,]  1  45 2 2345

其中包含更多行。我想按以下方式过滤:如果列 c = 3,我正在寻找以下行,这些行与我的 c=3 列具有相同的 a 和 b 列值,c 列值必须为 1 并且介于两者之间行在 d 列中必须有 < 10 的差异。

因此,在提供的示例中,输出应为:

      a   b c    d
[1,]  1 100 3 3400
[4,]  1 100 1 3408

由于 a 和 b 列具有相同的值,因此 c 列的值是 3,后跟 1,d 值之间的差值小于 10。例如,


      a   b c    d
[5,] -1  78 3 3412
[7,] -1  78 1 3436

不应包含在输出中,因为在 d 列中,值之间的差异大于 10。

有没有可能实现它?抱歉,如果这是一个愚蠢的问题,我对 R 很陌生。

编辑:新数据框:

       a   b c    d
 [1,]  1 100 1 3400
 [2,]  1 200 2 3403
 [3,] -1  50 4 3407
 [4,]  1 100 3 3408
 [5,] -1  78 3 3412
 [6,]  1  45 2 3423
 [7,] -1  78 1 3436
 [8,] -1  34 3 3445
 [9,]  1  56 5 3234
[10,] -1  34 1 3454
[11,]  1  45 2 3645

期望的结果:

 [8,] -1  34 3 3445
[10,] -1  34 1 3454

仅应考虑第一行的 c 列 = 3 的对,而不是第一行的 c 列条目 = 1 而第二行的条目 = 3 的情况。

标签: rfilterconditional-statements

解决方案


我们可以转换为 data.frame 然后做一个 group byfilter

library(dplyr)
df %>% 
    filter(c %in% c(3, 1)) %>%
    group_by(a, b) %>% 
    filter(first(c) == 3, any(diff(d) < 10)) %>% 
    ungroup

# A tibble: 2 x 4
#      a     b     c     d
#   <dbl> <dbl> <dbl> <dbl>
#1     1   34     3  3445
#2     1   34     1  3454

数据

 df<- data.frame(a,b,c,d)

推荐阅读