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?
Was ist 'PCM'? Bitte zeigen Sie ein kleines reproduzierbares Beispiel und eine erwartete Ausgabe – akrun
Bitte lesen Sie http://stackoverflow.com/help/mcve, um eine Frage zu posten, die empfohlen wird –
'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