2016-08-08 8 views
0

Ich habe einige Daten, die wie folgt aussehen: Ziele ist eine Liste von ZielknotenWie konstruiert man eine Kantenliste aus Daten in R?

+--------+-----------+ 
| Source | Targets | 
+--------+-----------+ 
|  1 | 3, 4, 5 | 
|  2 |  1, 3 | 
|  3 | 6, 10, 11 | 
+--------+-----------+ 

Wo Quelle ein Knoten in Graph Daten vorhanden ist, und dann, das heißt es gibt eine Verbindung von Knoten 1 bis 3, 4, d 5 Knoten. Ich möchte eine Kanten-Liste erstellen, etwa so:

+------+----+ 
| From | To | 
+------+----+ 
| 1 | 3 | 
| 1 | 4 | 
| 1 | 5 | 
+------+----+ 

Aber ich habe Probleme bekommen dies in R. getan, um das Beste, was ich habe in der Lage noch zu tun, ist die folgende:

extract_edges <- function(row) { 
    targets <- strsplit(as.character(locke_relations[row, 3]), ", ") 
    df <- data.frame() 
    for(t in targets) { 
    newrow <- data.frame(from=locke_relations[row,1], to=t) 
    df <- rbind(df, newrow) 
    } 
    df 
} 
lapply((2:3), extract_edges) 

locke_relations oben ist die Daten, die mehr oder weniger in der Form oben ist, und in diesem Code oben, ich bin nur zwei Zeilen verarbeitet (Zeilen 2 & 3). Es wird mir eine Liste von Datenrahmen enthält, die mehr oder weniger corrrect:

[[1]] 
    from to 
1 47678 48378 
2 47678 48379 

[[2]] 
    from to 
1 47686 47804 
2 47686 49326 

Aber was ich wirklich hier will, ist:

from to 
1 47678 48378 
2 47678 48379 
3 47686 47804 
4 47686 49326 

Ich könnte versuchen, einen Weg zu finden, um die Liste zusammen zu fusionieren, aber ich Ich habe das Gefühl, dass meine ganze Herangehensweise weg ist und dass es in R einen viel effizienteren Weg gibt, dies zu tun. Weiß jemand, wie wäre das der beste Weg, dies in R zu tun?

Antwort

3

Sie können separate_rows von tidyr verwenden:

tidyr::separate_rows(df, Targets) 

# source target 
#1  1  3 
#2  1  4 
#3  1  5 
#4  2  1 
#5  2  3 
#6  3  6 
#7  3  10 
#8  3  11 
+0

Was ist 'df' hier? Ich versuche zu verstehen, wie sich das auf das bezieht, was ich oben habe. – fraxture

+0

'df' ist der ursprüngliche Datenrahmen, der alle Beziehungen enthält. 'locke_relations' in Ihrem Fall. 'Targets' ist der Spaltenname, der die' to' Knoten enthält. – Psidom

+0

Ich versuche, Dokumentation für diese tidyr-Bibliothek zu finden, damit ich eine Definition der Funktion seperate_rows lesen kann. Aber ich kann keine Dokumente finden? Kannst du mich auf etwas @Psidom hinweisen? – fraxture

1

ich auf data.table wetten (ich bin 99% sicher, dass es sein wird, schnellste und Speicher effizient):

library(data.table) 
data = "1 2,3,4\n2 3,4,5" 
dt = fread(data, sep = " ", col.names = c("from", "to")) 
res = dt[, .(to = unlist(strsplit(to,",",T), recursive = F, use.names = F)), by = from] 

EDIT: wahrscheinlich einfacher base Lösung wird noch effektiver sein:

library(data.table) 
library(magrittr) 
data = "1 2,3,4\n2 3,4,5,6" 
dt = fread(data, sep = " ", col.names = c("from", "to")) 
edges = lapply(strsplit(dt$to, ',', T), as.integer) 
cnts = vapply(edges, length, 0L) 
res = data.frame(from = rep(dt$from, cnts), 
       to = unlist(edges, recursive = F, use.names = F)) 
Verwandte Themen