过滤分组变量

时间:2018-12-12 06:13:56

标签: r dplyr

我有一个数据框:

df <- data.frame(
          Group=c('A','A','A','B','B','B'),
          Activity = c('Act1','Act4', 'Act3','Act1', 'Act2','Act3')
        )

我只想过滤包含活动Act1Act2的那些组。以下代码返回零值:

df %>% group_by(Group) %>% filter(Activity == 'Act1' & Activity == 'Act2')

如果我使用df %>% group_by(Group) %>% filter(Activity %in% c('Act1' , 'Act2') ),它还会返回不需要的组A。

我如何仅获取那些必然包含两个活动的组?

1 个答案:

答案 0 :(得分:3)

您需要将其包装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 

在基本R选项ave中使用相同的逻辑

df[as.logical(ave(df$Activity, df$Group, 
              FUN = function(x) any(x == 'Act1')  & any(x == 'Act2'))), ]

您可以使用all

获得相同的结果
df %>% 
  group_by(Group) %>% 
  filter(all(c("Act1", "Act2") %in% Activity))

,与ave

类似
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