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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:22:36