2015-01-04 46 views
4

我试图结合两个图具有相同的节点,但这样的新图形边缘权重是两个原始图形的总和(但当然希望解决方案扩展到N图表):结合两个图形,并在R igraph中添加边缘权重

g1 <- graph.empty(directed=FALSE) + vertices(letters[1:2]) 
g1 <- g1 + edge("a", "b") 
E(g1)$weight <- 1 

g2 <- graph.empty(directed=FALSE) + vertices(letters[1:2]) 
g2 <- g2 + edge("a", "b") 

E(g2)$weight <- 2 

g3 <- g1 %u% g2 

E(g3)$weight_1 #this is 1 
E(g3)$weight_2 #this is 2 

但我想E(G3)$权重为3。

是否有这样做不是横跨边缘的权重相加_1,_2,更优雅的方式。 ..事后?简化/合同的一些事情?

+2

看起来Gabor一直在暗示这个[一段时间]的选项(https://lists.nongnu.org/archive/html/igraph-help/2012-10/msg00115.html),所以,必须做到“不雅”的方式(这实际上不是不雅的IMO) – hrbrmstr

回答

2

只需添加weight_1weight_2。 igraph目前没有办法将多个图形中的顶点/边缘属性组合在一起,除非是手动。这通常不是一个大问题,因为它只是一个额外的代码行(每个属性)。那么,如果要删除_1,_2属性,则需要三行。因此,所有你需要做的是:

E(g3)$weight <- E(g3)$weight_1 + E(g3)$weight_2 

和潜在

g3 <- remove.edge.attribute(g3, "weight_1") 
g3 <- remove.edge.attribute(g3, "weight_2") 

我在IGRAPH问题跟踪器所造成的问题这一点,但不要指望它的任何时间很快工作: https://github.com/igraph/igraph/issues/800

+0

如果你有边缘存在于一个网络,但不是另一个,你将在执行联合后为某些边权重提供NAs。在添加之前,需要将它们更改为0,以便正确添加所有内容。 'E(g3)$ weight_1 [is.na(E(g3)$ weight_1)] < - 0'等等。 – bcarothers