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

は(this postのように)group_by()、その後filterを行うのは、2個の基で、非常に単純なデータを見てみましょう、と私はグループにBを選択しますあなただけのトンでany()機能を使用する必要があります。

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

Group Value 
    <fctr> <int> 
1  B  4 
+0

あります[(df、ave(値== 4、グループ、FUN =任意))、] ' –

答えて

6

これは非常に簡単であることが判明:だけではなく、グループ全体4の値が含まれている個々の行を選択します彼はfilterを呼び出します。確かに、それが表示されていること:

  • filter(any(...))group_by()レベルで評価し、

  • filter(...)group_by()が先行した場合でも、rowwise()レベルで評価します。

は、従って使用:

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 
0

data.tableオプションが基地R、 'DFで

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