2013-04-03 13 views
14

In einer vorgegebenen Liste zu Datenrahmen "" in dieser Reihenfolge der Präferenz)?Convert R Liste mit fehlenden/NULL Elemente

Einfache Methoden, die ldply verwenden, schlagen fehl, weil es versucht, jedes Listenelement in einen Datenrahmen zu konvertieren, aber den mit den NULL-Barfs, da die Längen nicht übereinstimmen. Beste, was ich im Moment habe, ist:

> ldply(alist,function(s){t(data.frame(unlist(s)))}) 
    name age 
1 Foo 22 
2 Bar <NA> 
3 Baz <NA> 

aber das ist ziemlich eklig und die numerische Variable wird zu einem Faktor ...

+0

Art ärgerlich, dass 'check.rows = false' noch einen Fehler zu Zeilen mit unterschiedlichen Anzahlen von Beobachtungen gibt ... –

Antwort

10

Ein Kommentar wollen erwähnt nur eine einzige Schleife, die zusammen, indem sie den Körper der beiden Schleifen mit @flodel's answer nur erreicht werden kann:

rbind.fill(lapply(alist, function(f) { 
    as.data.frame(Filter(Negate(is.null), f)) 
})) 

geben

name age 
1 Foo 22 
2 Bar NA 
3 Baz NA 
17

Schritt 1: entfernen NULL Artikel

non.null.list <- lapply(alist, Filter, f = Negate(is.null)) 

Schritt 2: stapelt alles zusammen :

library(plyr) 
rbind.fill(lapply(non.null.list, as.data.frame)) 
# name age 
# 1 Foo 22 
# 2 Bar NA 
# 3 Baz NA 

Bearbeiten: Wenn Sie eine Variable haben, die NULL für alle Ihre Listenelemente ist, würde es nicht in Ihrer endgültigen Ausgabe angezeigt. Wenn stattdessen würden Sie eine Spalte mit NA gefüllt möchte, sollte der erste Schritt nicht NULL s entfernen, sondern ersetzen sie durch NA s:

Schritt 1 Alternative: ersetzen NULL mit NA:

non.null.list <- lapply(alist, lapply, function(x)ifelse(is.null(x), NA, x)) 
+0

Diesen zweiten Schritt der Gegenstand dieser Frage war: http://stackoverflow.com/ Fragen/15753091/Convert-Mixed-Length-Named-Liste-zu-Daten-Frame/15753384 # 15753384, für die Josh O'Brien eine längere, aber mehr skalierbare Antwort hatte. – flodel

+0

Ich halte für eine Lösung, die nur eine Schleife/Anwendung Schritt hat ... Sonst scheint dies zu knacken. – Spacedman