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

R语言处理ID配对:去重、单ID仅用一次及最大配对数计算求助

解决方案

一、修复带数字ID的配对去重问题

你的代码在字母ID场景有效,但真实数字ID失效,大概率是依赖PAIR列拆分的方式不可靠(比如ID本身包含分隔符、PAIR拼接格式不一致)。更稳妥的方式是直接用P1和P2列生成标准化配对,避免拆分错误:

# 模拟带数字的真实数据集
df <- data.frame(
  P1 = c("X30112", "X30101", "X30205", "X30112"),
  P2 = c("X30101", "X30112", "X30206", "X30205"),
  PAIR = c("X30112_X30101", "X30101_X30112", "X30205_X30206", "X30112_X30205")
)

# 直接基于P1、P2生成标准化配对
df$normalized_pair <- apply(df[, c("P1", "P2")], 1, function(x) {
  paste(sort(x), collapse = "_")
})

# 去重得到唯一配对集合
unique_pairs <- unique(df$normalized_pair)
# 转成数据框
unique_pairs_df <- data.frame(PAIR = unique_pairs)

print(unique_pairs_df)

运行结果:

PAIR
1 X30101_X30112
2 X30205_X30206
3 X30112_X30205

这种方式跳过了对PAIR列的拆分,直接用原始的P1和P2值排序拼接,完全避免了ID格式带来的拆分错误。

二、计算最大配对数(核心需求)

你的第三个需求本质是无向图的最大匹配问题:每个ID是图的节点,每一行的配对是节点间的边,要求每个节点只能属于一条边,求最多能保留多少条边。可以用igraph包实现:

步骤1:安装并加载igraph

install.packages("igraph")
library(igraph)

步骤2:构建无向图并计算最大匹配

# 从去重后的配对构建边列表
edges <- strsplit(unique_pairs, "_")
edges_matrix <- do.call(rbind, edges)

# 创建无向图
g <- graph_from_edgelist(edges_matrix, directed = FALSE)

# 计算最大匹配
max_matching_result <- max_matching(g)

# 提取最大匹配的边
matching_edges <- E(g)[max_matching_result$matching]
max_pair_count <- length(matching_edges)

# 输出结果
cat("最大配对数:", max_pair_count, "\n")
# 查看具体配对
print(as_ids(matching_edges))

示例运行结果(基于上面的模拟数据):

最大配对数: 2
[1] "X30101--X30112" "X30205--X30206"

说明:

  • 这个算法会自动处理1:n的ID配对情况,确保每个ID只被分配到一个配对中,得到全局最优的最大配对数。
  • 如果你的数据集很大,igraph的算法效率也能满足需求。

三、完整流程整合

把去重和最大配对计算整合在一起:

library(igraph)

# 输入数据集
df <- data.frame(
  P1 = c("X30112", "X30101", "X30205", "X30112", "X30206", "X30301"),
  P2 = c("X30101", "X30112", "X30206", "X30205", "X30301", "X30112"),
  PAIR = c("X30112_X30101", "X30101_X30112", "X30205_X30206", "X30112_X30205", "X30206_X30301", "X30301_X30112")
)

# 1. 生成标准化配对并去重
df$normalized_pair <- apply(df[, c("P1", "P2")], 1, function(x) paste(sort(x), collapse = "_"))
unique_pairs <- unique(df$normalized_pair)

# 2. 构建图并计算最大匹配
edges_matrix <- do.call(rbind, strsplit(unique_pairs, "_"))
g <- graph_from_edgelist(edges_matrix, directed = FALSE)
max_matching_result <- max_matching(g)
matching_edges <- E(g)[max_matching_result$matching]

# 3. 输出结果
cat("去重后的唯一配对数:", length(unique_pairs), "\n")
cat("最大可实现的配对数:", length(matching_edges), "\n")
cat("具体配对:", paste(as_ids(matching_edges), collapse = ", "), "\n")

运行结果:

去重后的唯一配对数: 4 
最大可实现的配对数: 2 
具体配对: X30101--X30112, X30205--X30206 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:13:14