5
votes

I'm trying to combine two graphs with the same nodes, but such that the new graph edge weight is the sum of the two original graphs (but of course want the solution to extend to N graphs):

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

But i want E(g3)$weight to be 3.

Is there a more elegant way of doing this than summing across the edge weights _1, _2, ... afterwards? Something along the lines of simplify/contract?

1
Looks like Gabor has been suggesting an option for this for a while, so you'll have to do it the "inelegant" way (which really isn't inelegant IMO) - hrbrmstr

1 Answers

4
votes

Just add weight_1 and weight_2. igraph does not currently have a way to combine vertex/edge attributes from multiple graphs, except by hand. This is usually not a big issue, because it is just an extra line of code (per attribute). Well, three lines if you want to remove the _1, _2 attributes. So all you need to do is:

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

and potentially

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

I created an issue for this in the igraph issue tracker, but don't expect to work on it any time soon: https://github.com/igraph/igraph/issues/800