如何高效筛选出在x列同时包含var1和var2的grp分组?
筛选同时包含指定值的分组(dplyr简洁实现)
需求:从数据框中筛选出grp分组,要求每个分组的x列同时包含"var1"和"var2",替代原有用paste拼接字符串后判断的繁琐方法。
基础数据
library(dplyr) library(tibble) dat <- tibble( x = c("var1", "var2", "var1"), grp = c("grp1", "grp1", "grp2") )
简洁实现方法
方法1:检查分组是否包含全部目标值
直接在分组内通过all()和%in%判断目标值集合是否完全存在于当前分组的x列中:
# 保留符合条件的所有行 dat_filtered <- dat %>% group_by(grp) %>% filter(all(c("var1", "var2") %in% x)) %>% ungroup() dat_filtered$grp #> [1] "grp1" "grp1"
如果只需要提取唯一的分组名称,可以结合distinct()和pull():
# 获取唯一符合条件的分组名 valid_groups <- dat %>% group_by(grp) %>% filter(all(c("var1", "var2") %in% x)) %>% distinct(grp) %>% pull(grp) valid_groups #> [1] "grp1"
方法2:基于计数的判断(适用于目标值无重复的场景)
如果每个分组内的x值不会重复,也可以通过计数目标值的数量来判断:
dat %>% group_by(grp) %>% filter(sum(x %in% c("var1", "var2")) == 2) %>% ungroup()
说明
上述方法无需拼接字符串,逻辑更直观,代码更简洁,同时能避免因分组内x值顺序不同导致的判断错误(比如原方法中如果分组内x的顺序是"var2, var1"就会被误判)。
内容的提问来源于stack exchange,提问作者boshek
相关产品推荐
相关产品推荐

