Chamil Rathnayake
Chamil Rathnayake

Reputation: 129

Combining/Merging two graphs in igraph

I created the following two graphs using igraph:

t1terms <- c("fire",
            "people",
            "residents",
            "victims", 
            "affected", 
            "please",
            "can",
            "london",
            "support",
            "survivors")

t1labels <- as.vector(t1terms)

g<-graph.full(n=10, directed = FALSE, loops = FALSE) %>%
  set_vertex_attr("label", value = t1labels)


t2terms <- c("fire",
             "victims",
             "says",
             "people",
             "cladding",
             "police",
             "may",
             "will",
             "dead",
             "theresa")

t2labels <- as.vector(t2terms)

g1<-graph.full(n=10, directed = FALSE, loops = FALSE) %>%
  set_vertex_attr("label", value = t2labels)

I can't figure out how to merge the two graphs without duplicating common nodes. I really appreciate some help. I tried 'graph.union', but it didn't work.

Thank you,

Chamil

Upvotes: 7

Views: 6018

Answers (2)

knapply
knapply

Reputation: 667

Use igraph's built-in conventions and make the vertex labels into each's name:

V(g)$name <- V(g)$label
V(g1)$name <- V(g1)$label

Grab the attributes and edge list of each graph and rbind() them together, creating a combination attribute data.frame and combination edge list data.frame while ensuring that you're only keeping unique() vertices:

attrs <- rbind(as_data_frame(g, "vertices"), as_data_frame(g1, "vertices")) %>% unique()
el <- rbind(as_data_frame(g), as_data_frame(g1))

Use attrs and el to make your new graph:

new_g <- graph_from_data_frame(el, directed = FALSE, vertices = attrs)

Upvotes: 5

G5W
G5W

Reputation: 37641

You can get the union by turning each graph into an edgelist, joining the edgelists and the making that into a graph.

EL  = matrix(get.vertex.attribute(g, "label")[get.edgelist(g)], ncol=2)
EL1 = matrix(get.vertex.attribute(g1, "label")[get.edgelist(g1)], ncol=2)
ELU = rbind(EL, EL1)
ELU = ELU[!duplicated(ELU),]
GU = graph_from_edgelist(ELU, directed=FALSE)

## To check the result
par(mfrow=c(1,3))
plot(g)
plot(g1)
plot(GU)

Union of two graphs

Upvotes: 1

Related Questions