在R数据集中多条件筛选:移除section a得分≥section b的分组
问题描述
给定以下R数据集:
dataset = data.frame(group = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3), date = c(120123, 120123, 120123, 120123, 120123, 120123, 120123, 120123, 120123, 120123, 120123, 120123, 120123, 120123, 120123), section = c("a", "b", "c", "d", "e", "a", "b", "c", "d", "e", "a", "b", "c", "d", "e"), score = c(0, 3, 0, 0, 0, 3, 3, 2, 2, 3, 0, 3, 1, 2, 0))
需要过滤掉所有分组中section="a"的score大于等于section="b"的score的分组,保留剩余分组的全部行,预期结果如下:
date group section score 1 120123 1 a 0 2 120123 1 b 3 3 120123 1 c 0 4 120123 1 d 0 5 120123 1 e 0 6 120123 3 a 0 7 120123 3 b 3 8 120123 3 c 1 9 120123 3 d 2 10 120123 3 e 0
解决方案
方法一:使用dplyr包(代码直观易读)
先确保安装并加载dplyr:
# 未安装则先执行 # install.packages("dplyr") library(dplyr) filtered_data <- dataset %>% group_by(group) %>% # 筛选出当前分组中a的score小于b的score的组 filter(score[section == "a"] < score[section == "b"]) %>% ungroup() print(filtered_data)
方法二:基础R实现(无需依赖第三方包)
# 提取每个分组下a和b的score值 group_scores <- tapply(dataset$score, list(dataset$group, dataset$section), function(x) x[1]) # 筛选出符合条件的分组 valid_groups <- rownames(group_scores)[group_scores[,"a"] < group_scores[,"b"]] # 过滤原始数据集 filtered_data <- dataset[dataset$group %in% valid_groups, ] print(filtered_data)
两种方法均可得到预期的过滤结果,dplyr写法更简洁,适合常规数据处理场景;基础R方法无需额外包,适合轻量需求场景。
内容的提问来源于stack exchange,提问作者Nguyen
相关产品推荐
相关产品推荐

