在R中使用igraph的图形交叉

时间:2014-12-12 13:38:05

标签: r igraph

所以,我正在使用igraph库计算R中的图形交集。我用这个命令: str(g1 %s% g2 %s% g3)

图表统计数据如下:

g1
IGRAPH UN-- 68 41 -- 
+ attr: name (v/c)

g2
IGRAPH UN-- 149 94 -- 
+ attr: name (v/c)

g3
IGRAPH UN-- 164 106 -- 
+ attr: name (v/c)

现在,我将这三个图的交集计算为:

temp <- str(g1 %s% g2 %s% g3)

当我看到temp时,

IGRAPH UN-- 335 0 -- 
+ attr: name (v/c)

这怎么可能?当我计算公共元素时,相交图中的最终顶点怎么可能比单个元素更多?

2 个答案:

答案 0 :(得分:2)

您可以使用keep.all.vertices参数graph.intersection()http://igraph.org/r/doc/graph.intersection.html如果您使用此参数,则需要直接拨打graph.intersection(),而不是使用中缀运算符,以便您可以传递额外的参数。使用其他答案的例子:

library(igraph)
g1 <- graph.formula(A -- B -- C -- D)
g2 <- graph.formula(C -- E -- D -- C)
g <- graph.intersection(g1, g2, keep.all.vertices = FALSE)
str(g)
#> IGRAPH UN-- 2 1 -- 
#> + attr: name (v/c)
#> + edges (vertex names):
#> [1] C--D

您可以将两个以上的图表传递给graph.intersection()

答案 1 :(得分:0)

尝试此示例:g1有4个顶点(A,B,C和D)和3个边,以及g2 3个顶点(C,D和E)和3个边。

require(igraph)
g1 <- graph.formula(A -- B -- C -- D)
g2 <- graph.formula(C -- E -- D -- C)
g <- str(g1 %s% g2)

在交叉点(g)中,有5个顶点(A,B,C,D和E),唯一的公共边是在C和D之间。

g
# IGRAPH UN-- 5 1 -- 
# + attr: name (v/c)

解释是,为了计算&#34;交叉口&#34;在2个或更多图形中,您需要处理两个(或更多)顶点集合的并集。

我没有任何好的解决方案来获得公共顶点上的&#34;交叉图&#34;。但我可以提出一些可能很脏的东西。希望有人会提出一个更清洁的解决方案:

ids <- which(V(g)$name %in% intersect(V(g1)$name, V(g2)$name))
g_intersection <- induced.subgraph(g, vids=ids)
# IGRAPH UN-- 2 1 -- 
# + attr: name (v/c)