2016-04-27 3 views
0

nach Knoten verbunden ich eine Adjazenzmatrix Angenommen, haben wie folgt:Wie finden ‚ersten‘ und ‚letzten‘ Vertex

library(igraph) 
df <- data.frame(id = 1:8, parent = c(NA, NA, 1, 1, 3, 4, NA, 7)) 
g <- graph_from_data_frame(na.omit(df)) 

sample graph

Für jede Ecke, wie mache ich das erste und letzte Vertices im gerichteten Pfad? Zum Beispiel beginnt der Vertex '4' bei 6 und endet bei 1. (Alternativ würde das Erlangen einer Liste aller Vertices in diesem Pfad funktionieren).

+0

Sie wollen also nur die eingehenden und ausgehenden Nachbarn? Was wäre das Ergebnis für Vertex 1 oder Vertex 8? Was passiert, wenn ein Scheitelpunkt mit mehr als 2 anderen Scheitelpunkten verbunden ist? Vielleicht check die Funktion 'neighors()' aus. – MrFlick

+0

Ich möchte die Root/Terminal-Blätter von jedem Baum. Die Daten sollten so sein, dass alle Bäume im Wald nur eine einzige Wurzel haben. – HoHo

Antwort

4

Betrachten Sie eine topologische Sortierung. Topologisches Sortieren eines gerichteten Graphen gibt Ihnen den ersten und letzten Eckpunkt.

Für R können Sie die topologische Sortiermethode im igraph-Paket verwenden. http://igraph.org/r/doc/topo_sort.html

0

Nach this answer endete I auf dem Wald dabei eine Graph Zersetzung, dann finden, die Scheitelpunkte gleich 0 einen Ausgangsgrad hatte, wodurch den Wurzelknoten für jeden Baumbestimmungs (für das gleiche zu tun in Grad Ausbeuten welche Scheitelpunkte sind terminal, obwohl ich erkannte, dass ich diese Information nicht brauchte - als Ergebnis schreibe ich das nicht als Antwort.

library(igraph) 
library(dplyr) 

df <- data.frame(id = 1:8, parent = c(NA, NA, 1, 1, 3, 4, NA, 7)) 
edgelist_df <- na.omit(df) 
g <- graph_from_data_frame(edgelist_df) 

tree_to_df <- function(graph, forest_edgelist){ 
    # for a directed tree, find its root and assign that root to every 
    # node in the tree's edgelist 

    # `dplyr::filter` fails on the subset below, so we use base R 
    tree_dat <- forest_edgelist[forest_edgelist$id %in% V(graph)$name,] 

    root <- which(degree(graph, v = V(graph), mode = 'out') == 0, useNames = T) 
    tree_dat$root <- names(root) 
    return(tree_dat) 
} 

root_dat <- 
    decompose.graph %>% # find connected subgraphs 
    lapply(tree_to_df, forest_edgelist = edgelist_df) %>% 
    bind_rows