【问题标题】:R how to filter a data frame based on conditions in following rows?R如何根据以下行中的条件过滤数据框?
【发布时间】:2021-06-20 13:13:19
【问题描述】:

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

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 列中存在差异

所以在提供的示例中,输出应该是:

      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 的情况。

【问题讨论】:

  • 顺便说一句,df&lt;-cbind(a,b,c,d) 返回 matrix,而不是 data.frame。你可能更喜欢df&lt;-data.frame(a,b,c,d)

标签: r filter conditional-statements


【解决方案1】:

我们可以转换成data.frame,然后通过filter进行分组

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)

【讨论】:

  • 不幸的是,这不适用于我的整个数据集,因为有时 a 列具有相同的值,而 d 的差异小于 10,但 b 列的值不同。对于这种情况,您的代码出现错误。对这个问题有什么建议吗?
  • @jonas7745 你能用一个不起作用的例子更新你的帖子,以便我可以测试它
  • @jonas7745 预期的输出是相同还是不同?
  • 完全一样
  • @jonas7745 用any 包装,它应该适用于该示例(更新帖子)
猜你喜欢
  • 2022-09-29
  • 1970-01-01
  • 2018-09-15
  • 2012-12-21
  • 1970-01-01
  • 2013-09-06
  • 2021-07-24
  • 2021-12-08
  • 2021-06-25
相关资源
最近更新 更多