2015-04-19 11 views
14

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") 

a plot of an igraph with several disconnected components

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?

+4

Możesz chcieć rzucić okiem na 'clusters (g)' i 'd <- decompose.graph (g); fabuła (dg [[1]]) '. – lukeA

Odpowiedz

21

Można obliczyć podłączonych komponentów wykresu za pomocą:

clusters(g) 
# $membership 
# [1] 1 1 1 1 1 1 2 2 3 1 
# 
# $csize 
# [1] 7 2 1 
# 
# $no 
# [1] 3 

lub można utworzyć osobny wykres dla każdego składnika wykresu za pomocą:

dg <- decompose.graph(g) # returns a list of three graphs 
plot(dg[[1]]) # plot e.g. the 1st one 

enter image description here

+0

Czy gwarantuje to, że pierwszy komponent jest zawsze największy? –

+0

@ user538603 no. Możesz jednak zamówić wynik przez 'vcount' i uzyskać pożądany wynik. – lukeA

Powiązane problemy