/ / Come dividere un igraph in selezionati sottografi connessi? - r, igraph

Come dividere un igraph in selezionati sottografi connessi? - r, igraph

Questa è un'estensione della domanda postata in precedenza: Come dividere un igraph in sottografi connessi?

Userò lo stesso esempio della domanda precedente

library(igraph)
g <- simplify(
graph.compose(
graph.ring(10),
graph.star(5, mode = "undirected")
)
) + edge("7", "8")

inserisci la descrizione dell'immagine qui

L'utente originale voleva separare la retenei componenti collegati. Vorrei ottenere una selezione dei componenti collegati in base ai nodi, cioè voglio le reti contenenti i nodi 9 e 2.

Penso che potrebbe essere fatto con decompose.graph(g) ma non sono sicuro di come rimettere insieme i due sottotitoli, ho bisogno di qualcosa del genere compose.graph(sub_g1, sub_g2).

risposte:

1 per risposta № 1

Un altro modo sarebbe utilizzare la ricerca in ampiezza:

g <- set.vertex.attribute(g,"name",index=V(g),as.character(1:vcount(g)))
#select nodes of interest:
nodes.of.interest <- c(2,9)
#find subgraphs that contain selected nodes
sel.nodes  <- bfs(g ,root = nodes.of.interest ,unreachable = FALSE)$order
#remove additional nodes:
g.sub <- induced.subgraph(g , vids = sel.nodes[!is.na(sel.nodes)])
plot(g.sub)

inserisci la descrizione dell'immagine qui


3 per risposta № 2

Puoi usare la funzione graph.union:

library(igraph)

g <- simplify(
graph.compose(
graph.ring(10),
graph.star(5, mode = "undirected")
)
) + edge("7", "8")

# IMPORTANT ! set vertex names otherwise when you split in sub-graphs you won"t be
# able to recognize them(and don"t forget as.character otherwise union will fail!)
g <- set.vertex.attribute(g,"name",index=V(g),as.character(1:vcount(g)))

# decompose the graph
sub.graphs  <- decompose.graph(g)

# search for the sub-graph indexes containing 2 and 9
sub.graph.indexes <- which(sapply(sub.graphs,function(g) any(V(g)$name %in% c("2","9"))))

# merge the desired subgraphs
merged <- do.call(graph.union,sub.graphs[sub.graph.indexes])

plot(merged)

inserisci la descrizione dell'immagine qui