如何在分组内匹配行并过滤不一致行?R语言数据处理需求
R 分组数据处理解决方案
示例输入数据
df <- structure(list(grp = c("1", "1", "2", "2", "3", "3"), view = c("A", "B", "A", "B", "A", "B"), type = c("Y", "N", "Y", "Y", "N", "N")), class = "data.frame", row.names = c(NA, -6L))
处理代码(基于dplyr)
library(dplyr) result_df <- df %>% group_by(grp) %>% # 标记分组内type是否全部一致 mutate(type_match = n_distinct(type) == 1) %>% # 按规则筛选行:不匹配则留Y,匹配则保留所有行 filter(ifelse(!type_match, type == "Y", TRUE)) %>% # 保留每个分组中view为A的行(对应期望输出要求) filter(view == "A") %>% ungroup() %>% # 移除辅助标记列 select(-type_match)
输出结果
运行代码后得到的结果与预期一致:
> result_df # A tibble: 3 × 3 grp view type <chr> <chr> <chr> 1 1 A Y 2 2 A Y 3 3 A N
对应的结构为:
structure(list(grp = c("1", "2", "3"), view = c("A", "A", "A"), type = c("Y", "Y", "N")), class = "data.frame", row.names = c(NA, -3L))
逻辑说明
- 分组标记:通过
n_distinct(type)判断每个分组内的type是否只有一种取值,生成type_match辅助列 - 条件筛选:根据
type_match的值执行筛选逻辑:分组内type不匹配时仅保留type = Y的行;匹配时保留所有行 - 统一视图:按照期望输出要求,保留每个分组中
view = A的行 - 清理输出:取消分组并移除辅助列,得到最终结果
内容的提问来源于stack exchange,提问作者ksinva
相关产品推荐
相关产品推荐

