2016-11-27 60 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