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