Unlist alle Listenelemente in einem dataframe
Habe ich einen Daten-frame mit den folgenden Klassen von Variablen für jede Spalte:
"date" "numeric" "numeric" "list" "list" "numeric"
Die Daten in jeder Zeile sieht wie folgt aus:
1978-01-01, 12.5, 6.3, c(0,0,0.25,0.45,0.3), c(0,0,0,0.1,0.9), 72
Möchte ich, um es zu transformieren in eine matrix oder ein data frame mit einem Wert pro Spalte, also das Ergebnis sollte so Aussehen:
1978-01-01, 12.5, 6.3, 0, 0, 0.25, 0.45, 0.3, 0, 0, 0, 0.1, 0.9, 72
Ich habe versucht mit:
j<-unlist(input)
output<-matrix(j,nrow=nrow(input),ncol=length(j)/nrow(input))
Aber es vermasselt die Reihenfolge der Zeilen in der Ausgabe.
Irgendeine Idee?
Zusätzliche Informationen:
Das obige Beispiel ist etwas vereinfacht und dput(head(input))
gibt das folgende Beispiel:
structure(list(DATE = structure(c(2924, 2925, 2926, 2927, 2928,
2929), class = "Date"), TEMP_MEAN_M0 = c(-7.625, -7.375, -6,
-5.5, -7.625, -9.625), SLP_MEAN_M0 = c(1012.125, 991.975, 989.825,
986.675, 988.95, 993.075), WIND_DIR_RF_M0 = structure(list(`2.counts` = c(0,
0.625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125, 0, 0, 0, 0.125), `3.counts` = c(0.75,
0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `4.counts` = c(0.375,
0.125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125, 0.125, 0, 0, 0), `5.counts` = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125,
0, 0, 0.125, 0.375, 0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0), `6.counts` = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125,
0, 0.25, 0.125, 0.25, 0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0), `7.counts` = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0.125, 0.5, 0.375, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("2.counts",
"3.counts", "4.counts", "5.counts", "6.counts", "7.counts")),
CEIL_HGT_RF_M0 = structure(list(`2.counts` = c(0.625, 0,
0, 0, 0, 0, 0, 0, 0, 0.375), `3.counts` = c(0.75, 0.125,
0, 0.125, 0, 0, 0, 0, 0, 0), `4.counts` = c(0.25, 0.125,
0, 0.125, 0, 0, 0, 0, 0.25, 0.25), `5.counts` = c(0, 0, 0,
0, 0, 0, 0, 0, 0.125, 0.875), `6.counts` = c(0, 0, 0, 0,
0, 0, 0, 0, 0, 1), `7.counts` = c(0, 0, 0, 0, 0, 0, 0, 0,
0, 1)), .Names = c("2.counts", "3.counts", "4.counts", "5.counts",
"6.counts", "7.counts")), WIND_SPD_MEAN_M0 = c(12.8125, 18.7375,
6.175, 8.175, 10.5375, 16.5375)), .Names = c("DATE", "TEMP_MEAN_M0",
"SLP_MEAN_M0", "WIND_DIR_RF_M0", "CEIL_HGT_RF_M0", "WIND_SPD_MEAN_M0"
), row.names = c(NA, 6L), class = "data.frame")
- Matrizen und Atomare Vektoren müssen alle den gleichen Modus. Und die meisten Operationen (einschließlich
unlist
) betreiben Spalte weisen eher als row-wise. Wenn Sie bereit sind, Daten in Ganzzahlen konvertiert das könnte machbar sein, aber so wie es da steht Sie "cunna von hier". Wenn Sie möchten, Ihnen weiter zu helfen, sollte die post das Ergebnis derdput(head(input))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist etwas unübersichtlich und wahrscheinlich ziemlich ineffizient, aber das sollte Ihnen den Einstieg erleichtern:
Hier einige Beispieldaten:
Und, ein wenig Funktion, die überprüft, um zu sehen, welche Spalten Listen und für diejenigen Spalten,
rbind
s Ihnen zusammen, und letztlichcbind
s mit den Spalten, die nicht Listen.Wird dies nur funktionieren, wenn jede "Spalte" Liste enthalten die Vektoren die gleiche Länge haben (sonst base R s
rbind
wird nicht funktionieren).Update
Erneuten Besuch dieser Frage einen halben Tag später, sehe ich, dass ein anderer Benutzer (@user1981275) geschrieben, eine Lösung, die einfacher ist, aber dann gelöscht Ihre Antwort. Vielleicht ist Sie gelöscht, weil Ihre Methode konvertiert die Daten in Ganzzahlen da, als DWin darauf hingewiesen, Elemente in den Matrizen müssen alle die gleiche mode.
Hier war Ihre Lösung:
Hier ist, wie es kann leicht geändert werden, um die gewünschte Ausgabe erhalten. Dies wird definitiv schneller sein als der frühere Ansatz:
Oder, wie ein Benutzer-Funktion:
Update 2
Habe ich auch geschrieben, mehr leistungsfähige Funktion namens
col_flatten
das ist Teil meiner "SOfun" - Paket.Installieren Sie das Paket mit:
Dann können Sie tun:
Es basiert auf der
transpose
Funktion "Daten.Tisch", so werden Sie sicher, dass "Daten.Tisch" als gut..csv
Ausgabe bei Verwendung der akzeptierten Antworten skizziert here. Leider konvertiert er alle meine Spalten die Faktoren. Gibt es eine Möglichkeit sicherzustellen, dass numerische Felder bleiben numerischen?