按组筛选:移除不包含指定字符串集合的组内所有行
问题描述
现有如下R数据:
individual <- 1:10 group <- c("A", "A", "B", "B", "B", "C", "C", "D", "D", "D") colour <- c("Red", "Blue", "Red", "Red", "Red", "Red", "Blue", "Red", "Red", "Blue") df <- data.frame(individual, group, colour)
数据包含组别(A、B、C等),每个组由不同数量的个体组成,每个个体对应不同颜色。需求是移除所属组未包含指定颜色集合的所有行。例如指定必需颜色集合:
required_list <- c("Red", "Blue")
示例中组别B仅包含Red,未同时覆盖Red和Blue,因此需移除组别B的所有行,期望输出如下:
individual2 <- c(1,2,6,7,8,9,10) group2 <- c("A", "A", "C", "C", "D", "D", "D") colour2 <- c("Red", "Blue", "Red", "Blue", "Red", "Red", "Blue") df2 <- data.frame(individual2, group2, colour2)
Base R 实现
无需额外包,通过分组校验+筛选实现:
# 定义必需颜色集合 required_list <- c("Red", "Blue") # 按组校验是否包含所有必需颜色,筛选出有效组 group_check <- tapply(df$colour, df$group, function(x) all(required_list %in% x)) valid_groups <- names(group_check)[group_check] # 保留有效组的所有行 df2 <- df[df$group %in% valid_groups, ]
dplyr/tidyverse 实现
利用分组过滤逻辑,代码更简洁直观:
library(dplyr) required_list <- c("Red", "Blue") df2 <- df %>% group_by(group) %>% filter(all(required_list %in% colour)) %>% ungroup()
内容的提问来源于stack exchange,提问作者Will Hamilton
相关产品推荐
相关产品推荐

