首页 > 解决方案 > 仅在两个级别都存在时过滤组

问题描述

这感觉应该更简单,我只是错过了一些东西。目标是将数据过滤到一个新的 df 中,其中 var 值 1 和 2 都在组中表示

这是一些玩具数据:

grp <- c(rep("A", 3), rep("B", 2), rep("C", 2), rep("D", 1), rep("E",2))

var <- c(1,1,2,1,1,2,1,2,2,2)

id <- c(1:10)

df <- as.data.frame(cbind(id, grp, var))

只有 grp A 和 C 应该出现在新数据中,因为它们是唯一存在 var 1 和 2 的数据。

我试过 dplyr,但显然 '&' 不起作用,因为它不是基于行的,而且 '|' 只返回相同的df:

df.new <- df %>% group_by(grp) %>% filter(var==1 & var==2) #returns no rows

标签: rdplyr

解决方案


这是另一种dplyr方法。这可以适用于 中的两个以上因子水平var

library(dplyr)

df2 <- df %>%
  group_by(grp) %>%
  filter(all(levels(var) %in% var)) %>%
  ungroup()
df2
# # A tibble: 5 x 3
#   id    grp   var  
#   <fct> <fct> <fct>
# 1 1     A     1    
# 2 2     A     1    
# 3 3     A     2    
# 4 6     C     2    
# 5 7     C     1 

推荐阅读