2016-04-06 5 views
1

Ich versuche, einen Datenrahmen für eine effizientere Speicherung und Abfrage neu zu gestalten. Jede Zeile enthält einen "Eltern" - (Schlüssel-) Wert, der zwischen den Zeilen nicht eindeutig ist, und einen Kindwert (eigentlich einen Satz von 3 Attributen - 1 Zeichen und 2 Ziffern). Ich möchte diesen Datenrahmen in eine Liste umwandeln, die nur einen Eintrag der obersten Ebene für jeden eindeutigen übergeordneten Schlüssel und eine Anzahl von Unterlisten enthält, die durch die Anzahl der mit dem übergeordneten Knoten assoziierten Kinder bestimmt werden. Hier sind einige Beispieldaten:Wie konvertiert man effizient einen Datenrahmen in eine Liste von Listen beliebiger Länge?

pcm <- data.frame(parent = c("middle", "middle", "might", "might", 
        "might", "million", "million", "millions"), 
       child = c("of", "school", "be", "have", "not", "in", 
        "to", "of"), 
       count = c(476, 165, 1183, 619, 321, 490, 190, 269)) 

Die Ausgabe für diese eine Liste mit vier Elemente der obersten Ebene (genannt "middle", "might", "million", "millions") und eine unterschiedliche Anzahl von Unterlisten mit Namen Mitglieder $child und $count (zB lookup4[["middle"]] enthält Unter sein sollte $children[[1]]$child = "of", $count = 476 und $children[[2]]$child = "school", $count = 165).

Der folgende Code funktioniert, ist aber extrem langsam (mehrere Stunden in einem Datenrahmen von 300.000 Zeilen mit 8 GB RAM). Ich habe die Anzahl der Kinder in den Ausgangsdaten auf 6 begrenzt, aber es scheint keinen großen Unterschied gemacht zu haben.

lookup4 <- list() 
parents <- unique(pcm$parent) 
n.parents <- length(parents) 
for (i in 1:n.parents) { 
    words <- pcm$child[pcm$parent == parents[i]] 
    counts <- pcm$count[pcm$parent == parents[i]] 
    probs <- pcm$prob[pcm$parent == parents[i]] 
    n.children <- min(c(NROW(words), 6) 
    ngram.tail <- list() 
    for (k in 1:n.children) { 
     ngram.tail[[k]] <- list(word = words[k], 
     count = counts[k], 
     prob = probs[k]) 
    } 
    lookup4[[parents[i]]] <- list(children = ngram.tail) 
} 

Könnte ich es beschleunigen, indem ich die "for" -Schleife eliminiere? Wenn ja, wie würde ich die Transformation codieren?

+3

Was ist 'PCM'? Bitte zeigen Sie ein kleines reproduzierbares Beispiel und eine erwartete Ausgabe – akrun

+3

Bitte lesen Sie http://stackoverflow.com/help/mcve, um eine Frage zu posten, die empfohlen wird –

+1

'split (pcm [, c (" Kind "," Anzahl "," Prob "))], pcm $ parent) 'sollte der erste Schritt sein. Als nächstes, was ist der Grund dafür, viele Unterlisten anstelle eines "data.frame" mit mehreren Zeilen zu haben? Ich denke, dass die Ausgabe von 'split (...)' genug sein sollte. – nicola

Antwort

0

Versuchen Sie folgendes:

Ich nehme an, dass die Datenrahmen parents genannt wird:

parents.list <- as.list(as.data.frame(t(parents))) 

Wenn Sie die Zeile Namen der Eltern wollen die Namen der Liste zu sein:

parents.list <- setNames(split(parents, seq(nrow(parents))), rownames(parents)) 
+0

Danke Felipe, aber diese tun nicht, was ich will. Der Name jedes Top-Level-Listenelements sollte ein eindeutiger Wert von "Eltern" sein. Ich werde in Kürze einige Beispieldaten veröffentlichen. – AltShift

Verwandte Themen