如何在igraph中限制cluster_edge_betweenness的社区数量为2?
解决固定社区数为2时提取成员名称的问题
核心方法是:用cluster_edge_betweenness()生成社区树状结构后,通过cut_at()函数指定k=2强制划分成2个社区,再结合图的顶点名称提取各组成员,替代默认的$membership(默认返回最优模块度对应的社区数)。
下面是完整的模拟数据+循环处理代码,你可以直接套用到自己的月度数据上:
# 加载igraph包 library(igraph) # 模拟月度社交网络数据:12个月,每个月有不同的节点和互动边 set.seed(123) monthly_networks <- list() for (m in 1:12) { # 每个月随机生成10-15个节点 nodes <- paste0("ID_", sample(1:20, size = sample(10:15, 1))) # 随机生成无向互动边 edges <- sample(nodes, size = sample(15:25, 1), replace = TRUE) edges <- matrix(edges, ncol = 2) # 构建igraph对象 monthly_networks[[m]] <- graph_from_edgelist(edges, directed = FALSE) } # 循环处理每个月度网络,提取2个社区的成员 monthly_communities <- list() for (m in 1:length(monthly_networks)) { g <- monthly_networks[[m]] # 运行边介数聚类,生成社区树结构 cb <- cluster_edge_betweenness(g) # 强制切割为2个社区 membership_2groups <- cut_at(cb, k = 2) # 获取当前网络的所有节点名称 node_names <- V(g)$name # 提取两组的成员列表 group1 <- node_names[membership_2groups == 1] group2 <- node_names[membership_2groups == 2] # 存储月度结果 monthly_communities[[m]] <- list( month = m, group1 = group1, group2 = group2 ) } # 查看第一个月的分组结果 print(monthly_communities[[1]])
关键细节说明:
cut_at(cb, k=2):直接对cluster_edge_betweenness生成的社区树进行切割,指定固定分成2组,返回每个节点对应的社区编号(1或2)。V(g)$name:获取当前月度网络的所有节点名称,和membership_2groups结果一一对应,通过逻辑索引即可快速提取各组成员。- 如果你的原始数据是邻接矩阵格式,只需把
graph_from_edgelist替换为graph_from_adjacency_matrix就能适配。
内容的提问来源于stack exchange,提问作者JOLy cloé
相关产品推荐
相关产品推荐

