我有这3个igraph对象:
g1 <- graph( edges=c(1, 2, 2, 3, 3, 1), n=3, directed=T )
g2 <- graph( edges=c(1, 2, 2, 3, 1, 3), n=3, directed=T )
g3 <- graph( edges=c(1, 2, 2, 3, 1, 3, 3, 4), n=4, directed=T )
IGRAPH D--- 3 3 --
+ edges:
[1] 1->2 2->3 3->1
IGRAPH D--- 3 3 --
+ edges:
[1] 1->2 2->3 1->3
IGRAPH D--- 4 4 --
+ edges:
[1] 1->2 2->3 1->3 3->4
我想比较g1到g2和g2到g3的边缘。我想计算完全相同的边数,反转的边数(例如1-> 3变为3> 1),以及附加边的数量。
是否有一个简单的函数来进行这种边缘比较?
我目前如何做到获得边缘列表,然后做一些行匹配方法来比较存在与否:
igraph::get.edgelist(g1)
igraph::get.edgelist(g2)
igraph::get.edgelist(g3)
> igraph::get.edgelist(g1)
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 1
> igraph::get.edgelist(g2)
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 1 3
> igraph::get.edgelist(g3)
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 1 3
[4,] 3 4
然而,这似乎是啰嗦。是否有更简单的方法来比较两个igraph对象?
g1到g2的输出为:
same reverse addition
2 1 0
对于g2到g3将是:
same reverse addition
3 0 1
答案 0 :(得分:1)
我不确定它是否有任何不太复杂但你可以通过以下方式使用交叉和差异运算符,
u1 <- as.undirected(g1)
u2 <- as.undirected(g2)
u3 <- as.undirected(g3)
same=length(E(intersection(g2,g1)))
reverse=length(E(difference(g2,g1)))-length(E(difference(u2,u1)))
addition=length(E(difference(g2,g1)))-reverse
这只有在g2是g1的子图时才有效,但看起来这就是你在问题中提出的问题,因为你对边删除的数量不感兴趣。