通过出现值过滤组

时间:2016-11-27 01:53:38

标签: r dplyr

如何根据各行的条件选择组,例如过滤包含值4(或任何其他条件)的所有组。

让我们采用一个非常简单的数据,包含两组,我想选择 B 组(值为4)

library(dplyr)
df <- data.frame(Group=LETTERS[c(1,1,1,2,2,2)], Value=c(1:5,4))

> df
  Group Value

1     A     1
2     A     2
3     B     3
4     B     4

执行group_by()然后filter(如this post中所示)只会选择包含值4的单个行,而不是整个组:

df %>%
  group_by(Group) %>%
  filter(Value==4)

Group Value
  <fctr> <int>
1      B     4

3 个答案:

答案 0 :(得分:23)

事实证明这很简单:您只需要在any()调用中使用filter函数即可。实际上,似乎:

  • filter(any(...))评估group_by()级别,

  • filter(...)评估rowwise()级别,即使前面有group_by()

因此使用:

 df %>%
    group_by(Group) %>%
    filter(any(Value==4)) 

Group Value
 <fctr> <int>
1      B     3
2      B     4

有趣的是,与mutate相同,比较:

df %>%
group_by(Group) %>%
mutate(check1=any(Value==4), 
       check2=Value==4) 

   Group Value check1 check2
  <fctr> <int>  <lgl>  <lgl>
1      A     1  FALSE  FALSE
2      A     2  FALSE  FALSE
3      B     3   TRUE  FALSE
4      B     4   TRUE   TRUE

答案 1 :(得分:0)

data.table选项

library(data.table)
setDT(df)[, if(any(Value==4)) .SD, by = Group]
#   Group Value
#1:     B     4
#2:     B     5
#3:     B     4

答案 2 :(得分:0)

在基本R中,我们无需执行任何分组操作即可:

subset(df, Group %in% unique(Group[Value == 4]))

#  Group Value
#4     B     4
#5     B     5
#6     B     4