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