如何在R中对非完全重复的配对型记录进行去重?
解决无序配对记录的去重问题
你遇到的这个问题其实很典型——这是无序配对组合的去重场景:比如(2,43)和(43,2)本质是同一个配对,但因为两列顺序相反,常规的unique()或者dplyr::distinct()这类去重函数没法识别它们是重复项。下面给你两种实用的解决方案,不管用base R还是tidyverse工具都能搞定:
方法一:用dplyr(tidyverse风格)
我们可以给每一行生成一个「标准化配对键」——把A和B的元素按固定顺序排序后拼接成字符串,这样所有本质相同的配对都会生成同一个键,再基于这个键去重就简单了:
library(dplyr) # 你的原始数据 df <- data.frame( A = c("2","2","2","43","43","43","331","391","481","490","501","501","501","502","502","502"), B = c("43","501","502","2","501","502","491","496","490","481","2","43","502","2","43","501") ) # 生成标准化键并去重 df_unique <- df %>% rowwise() %>% # 把每行的A、B排序后拼接成唯一键 mutate(pair_key = paste(sort(c(A, B)), collapse = "-")) %>% ungroup() %>% # 保留每个唯一键对应的第一行 distinct(pair_key, .keep_all = TRUE) %>% # 删掉临时生成的键列 select(-pair_key) # 查看结果 print(df_unique)
运行后你会得到去重后的结果,所有像(2,43)和(43,2)这类重复配对只会保留一条。
方法二:用base R(无需额外包)
如果习惯用原生R代码,也可以直接通过按行排序+去重的方式实现:
# 你的原始数据 df <- data.frame( A = c("2","2","2","43","43","43","331","391","481","490","501","501","501","502","502","502"), B = c("43","501","502","2","501","502","491","496","490","481","2","43","502","2","43","501") ) # 按行排序后,用duplicated识别重复项,提取非重复行 df_unique <- df[!duplicated(t(apply(df, 1, sort))), ] # 查看结果 print(df_unique)
这个方法更简洁:apply(df,1,sort)按行对A、B排序,t()转置后用duplicated()找出重复的配对,最后用!取反得到非重复行的索引,提取即可。
两种方法最终都会得到你想要的目标输出:
A B 1 2 43 2 2 501 3 2 502 5 43 501 6 43 502 7 331 491 8 391 496 9 481 490
内容的提问来源于stack exchange,提问作者user3357059
相关产品推荐
相关产品推荐

