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

R语言如何根据邻接关系数据将数值划分到不同分组

R语言实现邻接关联数值的互斥分组

你的需求本质是无向图的二部图划分问题:把每个数值看作图的节点,邻接关系看作节点间的边,要求相邻节点不能同组,刚好对应二部图的两集合划分规则。

样例数据

df = data.frame(from=c(1,1,2,2,2,3,3,3,4,4,4,5,5), to=c(1,3,2,3,4,1,2,3,2,4,5,4,5))
df
#    from to
# 1     1  1
# 2     1  3
# 3     2  2
# 4     2  3
# 5     2  4
# 6     3  1
# 7     3  2
# 8     3  3
# 9     4  2
# 10    4  4
# 11    4  5
# 12    5  4
# 13    5  5

实现思路

  • 清洗邻接数据:剔除自环(from == to的行,单个节点和自身的邻接关系不影响分组逻辑)、去重无向边
  • 基于清洗后的边表构建无向图对象
  • 用二部图检测算法给节点打分组标签,保证相邻节点标签不同
  • 按标签拆分得到最终分组

可运行代码

# 若未安装igraph包,先运行 install.packages("igraph")
library(igraph)

# 数据清洗
valid_edges <- unique(df[df$from != df$to, ])
# 构建无向图
g <- graph_from_data_frame(valid_edges, directed = FALSE)
# 二部图划分
bipartite_res <- bipartite_mapping(g)
# 提取分组并排序
group_a <- sort(as.numeric(names(bipartite_res$type[bipartite_res$type])))
group_b <- sort(as.numeric(names(bipartite_res$type[!bipartite_res$type])))

运行结果

执行后得到的分组和预期完全一致:

> group_a
[1] 1 2 5
> group_b
[1] 3 4

说明:该方法仅当邻接关系构成的图是二部图(不存在奇数长度的环)时,才能用2个分组满足所有邻接值不同组的要求。如果图不是二部图,需要增加分组数量,可改用图着色算法计算最少需要的分组数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:06:21