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
相关产品推荐
相关产品推荐

