如何使用R igraph将多个简单图合并为多重图(替代graph.union)?
在R igraph中合并简单图为多重图的替代方法
graph.union会自动对重复边去重,所以没法得到你想要的多重图。这里有两种直接的替代方案:
方案一:用+运算符直接合并
igraph里的+运算符会保留所有边(包括重复的顶点对),直接合并两个图就能得到多重图:
G <- graph_from_literal(1-2:3-4-5:6) E(G)$at <- rep.int("a",6) G2 <- graph_from_literal(6-7-5-4) E(G2)$at <- c("b","b","b") # 直接用+合并 G3 <- G + G2 # 验证结果 is.simple(G3) # 输出FALSE,确认是多重图 E(G3)$at # 可以看到所有边的属性,包括4-5之间的两条边(分别带a和b属性) plot(G3)
方案二:手动合并边数据后创建新图
如果需要更灵活地控制边的合并逻辑,可以手动提取两个图的边数据,合并后创建新的多重图:
# 提取所有顶点(去重) all_vertices <- unique(c(V(G)$name, V(G2)$name)) # 转换边为数据框,保留属性 edges_g <- as.data.frame(E(G))[, c("from", "to", "at")] edges_g2 <- as.data.frame(E(G2))[, c("from", "to", "at")] # 合并边数据 combined_edges <- rbind(edges_g, edges_g2) # 创建多重无向图 G3 <- graph_from_data_frame(combined_edges, vertices = all_vertices, directed = FALSE) # 验证 is.simple(G3) # 输出FALSE E(G3)$at # 查看所有边的属性
两种方法都能保留重复的边,满足你生成多重图的需求。
内容的提问来源于stack exchange,提问作者Sebastián
相关产品推荐
相关产品推荐

