Mam igraph z kilkoma odłączonymi komponentami. NpJak podzielić igraph na połączone podgrafy?
library(igraph)
g <- simplify(
graph.compose(
graph.ring(10),
graph.star(5, mode = "undirected")
)
) + edge("7", "8")
W tym przykładzie węzeł 9 własny wykres, tak jak węzły 7 i 8, a resztę, tworząc trzeci wykres.
Chciałbym traktować je osobno, więc chcę przekonwertować pojedynczy igraph na listę 3 rysunków (podzielonych przez łączność).
Zhakowałem trochę kodu, aby to osiągnąć, ale jest to nieefektywne i dość okropne.
split_graph_into_connected_subgraphs <- function(g)
{
adjacency_list <- get.adjlist(g)
connected_nodes <- lapply(
adjacency_list,
function(adjacent_nodes)
{
new_nodes <- out <- adjacent_nodes
# Keep finding nodes that are adjacent to ones we already know about,
# until we find no more
repeat
{
doubly_adjacent_nodes <- Reduce(union, adjacency_list[new_nodes])
new_nodes <- setdiff(doubly_adjacent_nodes, out)
if(length(new_nodes) == 0)
{
break
}
out <- union(out, new_nodes)
}
sort(out)
}
)
# Single value nodes should contain themselves, not be empty
connected_nodes <- ifelse(
vapply(adjacency_list, length, integer(1)) == 0,
seq_along(connected_nodes),
connected_nodes
)
# We don't care about repeats, just the unique graphs
connected_nodes <- unique(connected_nodes)
# Get the subgraph from each
lapply(
connected_nodes,
function(nodes) induced.subgraph(g, nodes)
)
}
list_of_subgraphs <- split_graph_into_connected_subgraphs(g)
lapply(list_of_subgraphs, plot)
Czy istnieje wyraźniejszy sposób podziału wykresu?
Możesz chcieć rzucić okiem na 'clusters (g)' i 'd <- decompose.graph (g); fabuła (dg [[1]]) '. – lukeA