通过出现值过滤组

Mat*_*fou 17 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
Run Code Online (Sandbox Code Playgroud)

执行group_by()然后filter(如在此帖子中)将仅选择包含值4的单个行,而不是整个组:

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

Group Value
  <fctr> <int>
1      B     4
Run Code Online (Sandbox Code Playgroud)

Mat*_*fou 28

事实证明这很简单:你只需要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
Run Code Online (Sandbox Code Playgroud)

有趣的是,同样出现变异,比较:

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
Run Code Online (Sandbox Code Playgroud)


akr*_*run 8

一个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
Run Code Online (Sandbox Code Playgroud)