所以,我正在使用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)
这怎么可能?当我计算公共元素时,相交图中的最终顶点怎么可能比单个元素更多?
答案 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)