Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combine two graphs and add edge weights in R igraph

Tags:

r

igraph

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?

like image 334
SOUser Avatar asked Sep 29 '22 02:09

SOUser


1 Answers

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

like image 121
Gabor Csardi Avatar answered Oct 08 '22 11:10

Gabor Csardi