使用R语言igraph库查找两个同结构无向图中新增边的实现问题
嘿,我来帮你搞定这个问题!你的思路方向是对的,但用%in%直接比较边对象的方式在igraph里行不通,因为每个边对象都绑定到它所属的图,哪怕节点对完全一样,不同图里的边也会被当成不同的对象,这就是为什么你得到了补图的所有边。
给你两种简单靠谱的解法,都只用igraph库:
方法一:用igraph内置的difference函数(最推荐)
igraph专门提供了图的集合操作函数,difference(g2, g1)会直接返回一个只包含g2有但g1没有的边的图,完美匹配你的需求:
library(igraph) # 初始化你的两个图 g1 <- graph(edges=c(1,2,2,3,1,3,3,4,2,4,1,5), n=5, directed=FALSE) g2 <- graph(edges=c(1,2,2,3,1,3,3,4,2,4,1,5,3,5), n=5, directed=FALSE) # 获取新增边组成的图 new_edges_graph <- difference(g2, g1) # 查看新增边 E(new_edges_graph)
运行后会输出+ 1/1 edge from 4bcb50d (vertex names): [1] 3--5,正好是你要的结果。
方法二:通过边的节点对来比较
如果只想得到边的字符串或节点对列表,可以把每条边的节点排序后再用集合差来判断(因为无向图的边是无序的,排序后能统一格式):
# 获取g1的边列表,排序每个边的节点 g1_edge_pairs <- apply(get.edgelist(g1), 1, sort) g1_edge_strings <- paste(g1_edge_pairs[1,], g1_edge_pairs[2,], sep = "--") # 获取g2的边列表,同样排序节点 g2_edge_pairs <- apply(get.edgelist(g2), 1, sort) g2_edge_strings <- paste(g2_edge_pairs[1,], g2_edge_pairs[2,], sep = "--") # 找出g2独有的边 new_edge_strings <- setdiff(g2_edge_strings, g1_edge_strings) new_edge_strings
运行后会返回[1] "3--5",也能得到正确结果。
为什么你的原方法不行?
E(g1_complement) %in% E(g2)这个判断逻辑的问题在于:igraph的边对象是和所属图绑定的,哪怕两个边连接的是同一对节点,只要它们属于不同的图(一个来自补图,一个来自g2),%in%就无法识别它们是同一个边,所以这个条件相当于永远为真,自然返回了补图的所有边。
内容的提问来源于stack exchange,提问作者Mavil
相关产品推荐
相关产品推荐

