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