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

R语言如何按多列对比行数据并删除完全重复冗余行?

R语言数据集精准去重操作指南

需求背景

数据集清洗阶段需优先避免有效信息意外丢失,当前数据集包含两个核心标识列:

  • 名称列(name,示例中对应列A)
  • ID编号列(ID number,示例中对应列B)
    数据集存在重复值,但禁止仅用名称或ID单列执行去重,原因如下:
  • 部分ID关联的名称存在变体,属于待人工核查的有效条目
  • 部分相同名称会归属不同ID,对应完全不同的主体,不属于重复条目

原始示例数据

data<- data.frame(stringsAsFactors = FALSE,
                  A = c("dog", "dog", "cat", "cat", "bird", "big bird", "bird", "dog", "red dog"),
                  B = c(111, 111, 222, 222, 333, 333, 333, 444, 444),
                  C = c("1", "1", "2", "2", "3", "3", "3", "4", "4"))

原始数据共9行,其中全列取值完全一致的冗余重复行共3行,剩余行包含待核查的同ID异名条目、跨ID重名的不同主体条目。

预期输出结果

ideal<- data.frame(stringsAsFactors = FALSE,
                   A = c("dog", "cat", "bird", "big bird", "dog", "red dog"),
                   B = c("111", "222", "333", "333", "444", "444"),
                   C = c("1", "2", "3", "3", "4", "4")
                   )

处理后共6行,完全删除全列取值一致的冗余行,保留所有待核查有效条目。

处理规则

  • 对ID=333类数据:保留同ID下不同名称的条目(如bird/big bird)供后续人工核查,仅删除同ID下所有列取值完全一致的重复行
  • 对ID=444类数据:不同ID下的重名条目(如ID=111的dog和ID=444的dog)分属不同主体,禁止按名称全局去重
  • 阶段目标:仅删除多列取值完全匹配的明确冗余行,压缩待人工核查的数据量

实现代码

方法1:base R原生实现

无需安装加载第三方包,直接调用原生函数判断全列重复值,保留首次出现的非重复行:

clean_data <- data[!duplicated(data), ]

方法2:dplyr包实现

若日常使用tidyverse生态处理数据,可调用distinct函数实现全列去重,逻辑与原生方法一致:

library(dplyr)
clean_data <- data %>% distinct(across(everything()), .keep_all = TRUE)

上述两种方法输出结果与预期的ideal数据集完全一致,不会误删非全列匹配的待核查条目,也不会出现跨ID误删重名主体的问题。

内容的提问来源于stack exchange,提问作者Katie Nissen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:18:21