如何根据各行的条件选择组,例如过滤包含值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
答案 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