You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:06:29