/ / ¿Cómo dividir un igraph en seleccionar subgraphs conectados? - r, igraph

¿Cómo dividir un igraph en subgrafos conectados seleccionados? - r, igraph

Esta es una extensión de la pregunta publicada anteriormente: ¿Cómo dividir un igraph en subgraphs conectados?

Usaré el mismo ejemplo que la pregunta anterior

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

enter image description here

El usuario original quería separar la red.en los componentes conectados. Me gustaría obtener una selección de los componentes conectados en función de los nodos, es decir, quiero las redes que contienen los nodos 9 y 2.

Creo que se podría hacer con decompose.graph(g) pero no estoy seguro de cómo volver a unir los dos subgrafos. Necesito algo como compose.graph(sub_g1, sub_g2).

Respuestas

1 para la respuesta № 1

Otra forma sería utilizar la búsqueda en amplitud primero:

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)

enter image description here


3 para la respuesta № 2

Puedes usar la función 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)

enter image description here