R语言igraph如何基于组件最大度节点在图的不同组件间添加边
实现代码
library(igraph) # 读取示例数据构建初始图 graph1 <- graph_from_data_frame(g, directed = FALSE) E(graph1)$weight <- g$values # 计算图组件、节点度 cl <- components(graph1) node_degree <- degree(graph1) # 按组件分组,每个组件选1个度最高的节点(存在多个最高度节点时随机选1个) hub_nodes <- tapply(names(node_degree), cl$membership, function(nodes) { deg <- node_degree[nodes] max_deg_nodes <- nodes[deg == max(deg)] sample(max_deg_nodes, size = 1) }) # 所有组件的锚点两两加边连通全图,组件数为1时直接返回原图避免报错 if (cl$no > 1) { graph2 <- add.edges( graph1, c(combn(hub_nodes, 2)), weight = 0.01 ) } else { graph2 <- graph1 }
逻辑说明
- 先计算全图所有节点的度值,再按组件归属对节点做分组
- 对每个组件的节点集合,先筛选出度值最大的节点子集,若子集内节点数大于1则随机抽选1个作为当前组件的连接锚点
- 把所有组件的锚点两两组合添加边,即可保证所有组件连通,且连接节点均为各组件的最高度节点
- 新增的判断逻辑兼容原图已经是连通图的场景,避免无组件可合并时报错
内容的提问来源于stack exchange,提问作者0Knowledge
相关产品推荐
相关产品推荐

