R 分组变量的筛选
我有一个数据帧:R 分组变量的筛选,r,dplyr,R,Dplyr,我有一个数据帧: df <- data.frame( Group=c('A','A','A','B','B','B'), Activity = c('Act1','Act4', 'Act3','Act1', 'Act2','Act3') ) 如果我使用df%>%groupby(group)%>%filter(活动%in%c('Act1','Act2')),它还会返回我不需要的组A 我如何才能只获取那些必须同时包含活动的组 您需要包装
df <- data.frame(
Group=c('A','A','A','B','B','B'),
Activity = c('Act1','Act4', 'Act3','Act1', 'Act2','Act3')
)
如果我使用df%>%groupby(group)%>%filter(活动%in%c('Act1','Act2'))
,它还会返回我不需要的组A
我如何才能只获取那些必须同时包含活动的组 您需要包装它
any
library(dplyr)
df %>%
group_by(Group) %>%
filter(any(Activity == 'Act1') & any(Activity == 'Act2'))
# Group Activity
# <fct> <fct>
#1 B Act1
#2 B Act2
#3 B Act3
使用
all
df %>%
group_by(Group) %>%
filter(all(c("Act1", "Act2") %in% Activity))
与ave类似
df[as.logical(ave(df$Activity, df$Group,
FUN = function(x) any(x == 'Act1') & any(x == 'Act2'))), ]
df[as.logical(ave(df$Activity, df$Group,
FUN = function(x) all(c("Act1", "Act2") %in% x))),]
# Group Activity
#4 B Act1
#5 B Act2
#6 B Act3
谢谢不知道any
和ave
函数。一个小问题…是只考虑过滤两个值(Act1
和Act2
)。您的解决方案还返回组B
的Act3
。有没有办法克服这个问题?@Dhiraj我能想到的最直接的方法是添加一个附加条件df%>%groupby(group)%>%filter(所有(c(“Act1”、“Act2”)%在%Activity中)和%c(“Act1”、“Act2”)中的Activity%。
应该会给出你想要的。
df[as.logical(ave(df$Activity, df$Group,
FUN = function(x) all(c("Act1", "Act2") %in% x))),]
# Group Activity
#4 B Act1
#5 B Act2
#6 B Act3