2016-11-27 54 views
4

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

让我们以一个非常简单的数据,有两个组,我要选择组(如具有的值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 
+0

在基R,'DF [((df,ave(Value == 4,Group,FUN = any)),]' –

回答

6

这原来是很简单:你只需要使用T中的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 

有趣的是,相同的出现与发生变异,比较:

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 
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