识别两个 igraph 对象 r 之间的 same/different 条边数

Identify number of same/different edges between two igraph objects r

我有这 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

我不确定它是否更简单,但您可以按以下方式使用交集和差集运算符,

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 的子图时有效,但看起来这就是您在问题中提出的问题,因为您对边删除的数量不感兴趣。