R语言如何合并冗余行 消除两列镜像NA值实现数据去重
R折叠冗余行实现方案(tidyverse版本)
实现思路
按id1、id2之外的所有字段分组,同组即为需要合并的冗余行,在组内提取id1、id2的非缺失值填充,即可直接得到去重后的结果,不需要额外调用distinct()。
注意:示例原始数据中
id1列的"NA"是字符串格式,不是R语言识别的真正缺失值,需要先做转换否则填充逻辑会失效。
完整代码
library(tidyverse) # 读取并预处理示例数据 df <- data.frame(id1 = c("a" , "NA", "NA", "c"), id2 = c(NA,"a","a",NA), id3 = c("a", "a", "e", "e"), n1 = c(2,2,3,3), n2 = c(2,2,1,1), n3 = c(0,0,3,3), n4 = c(0,0,2,2)) %>% # 将字符串格式的"NA"转为真正的缺失值 mutate(across(c(id1, id2), ~na_if(., "NA"))) # 核心折叠逻辑 result <- df %>% # 按除id1、id2外的所有列分组,自动识别需要合并的冗余行 group_by(across(-c(id1, id2))) %>% # 组内提取id1、id2的第一个非缺失值作为该组的统一值 summarise( across(c(id1, id2), ~.x[!is.na(.x)][1]), .groups = "drop" ) %>% # 调整列顺序和原数据保持一致 select(all_of(colnames(df)))
运行结果
执行代码后得到的输出完全符合预期:
id1 id2 id3 n1 n2 n3 n4 1 a a a 2 2 0 0 2 c a e 3 1 3 2
方案优势
- 不依赖行的排列顺序,只要同组内
id1/id2存在有效值,就可以正确填充,比fill()类上下填充的方法鲁棒性更强 - 分组逻辑自动适配除
id1/id2外的所有字段,后续新增其他维度列时不需要修改分组代码 - 分组聚合后直接输出无重复的结果,不需要额外执行去重步骤
内容的提问来源于stack exchange,提问作者nlplearner
相关产品推荐
相关产品推荐

