2009-10-30 17 views
18

Ich habe eine Liste von Listen, die wie folgt aussieht: x[[state]][[year]]. Jedes Element ist ein Datenrahmen und der Zugriff auf sie ist kein Problem.rbind Datenrahmen in einer Liste von Listen

Allerdings möchte ich Datenrahmen über mehrere Listen binden. Genauer gesagt, würde ich gerne so viele Datenframes ausgeben, wie ich Jahre habe, das heißt alle State-Datenframes innerhalb jedes Jahres. Mit anderen Worten, ich möchte all meine Zustandsdaten Jahr für Jahr in separate Datenrahmen zusammenfassen.

Ich weiß, dass ich eine einzelne Liste in einen Datenrahmen mit do.call("rbind",list) kombinieren kann. Aber ich weiß nicht, wie ich das über Listenlisten hinweg tun kann.

+2

Aus Neugier, warum sind Sie mit Daten, die diese Art und Weise zu tun, anstatt nur einen großen Datenrahmen mit allen Daten? –

Antwort

6

Sie können entlang der folgenden Zeilen etwas tun (ich konnte nicht testen, da ich keine solche Struktur haben):

extract.year <- function(my.year) lapply(x, function(y) y[[my.year]]) 

x.by.year <- sapply(my.list.of.years, function(my.year) 
    do.call(rbind, extract.year(my.year))) 

Das Jahr Funktion Extrakt erstellt eine Liste nur die Datenrahmen für das jeweilige Jahr enthalten. Dann rbind Sie sie ...

+2

Mit der obigen Antwort wurde es immer komplizierter, also habe ich deinen Ansatz ausprobiert, was funktioniert hat! Mit ein wenig Modifikation. Die erste Zeile gab den gesuchten Datenframe zurück. Die zweite Zeile funktionierte nicht, stattdessen wandte ich mich Hadleys Plyr-Paket zu. Dieser Befehl gibt eine Liste von rbindenden Datenframes nach der ersten Zeile zurück: llply (meine.Liste.von.Jahren, Funktion (mein.Jahr) do.call (rbind, extrakt.Jahr (mein.Jahr))) Super, danke Leute für die Hilfe! – bshor

+1

ldply() ist noch schneller und effizienter! – bshor

32

Collapse es in eine Liste zuerst:

list <- unlist(listoflists, recursive = FALSE) 
df <- do.call("rbind", list) 
+0

Danke für die schnelle Hilfe! Aber das ist nicht genau das, was ich will. Ihre Antwort gibt mir einen EINZIGEN Datenrahmen aller Datenrahmen innerhalb der Liste der Listen (mit unlist, ein cooler Befehl, den ich nie kannte). Aber ich hätte gerne eine Liste von 32 rbind-Datenrahmen, die so viele Jahre wie ich haben, die alle Zustände zusammen kombinieren. Die erste Zeile Ihrer Antworten bringt mir eine ungefähre * Jahreslängenliste (obwohl ich aus irgendeinem Grund Länge = 1584, nicht 32 * 50 = 1600, wie ich erwarten würde). Also ich denke, das ist ein Hinweis ... – bshor

+0

Nach ein paar weiteren Experimenten denke ich, dass ich irgendwo hinkomme. Ich habe die Elemente der Zustandsliste zum ersten Mal benannt, so dass jetzt die Elemente der nicht aufgelisteten Liste (nach Hadleys erstem Befehl) nun nützliche Namen wie "AL3" und "TX4" haben. Jetzt muss ich alle 3 zusammen, alle 4s und so weiter kombinieren. – bshor

+0

Oh Junge, ich denke, reguläre Ausdrücke sind dann Teil der Antwort. Ich habe versucht grep ("1 $", Namen (Liste)), um die Listen, die mit einer "1" benannt bekommen, aber das bringt mir alle Jahre mit einer 1 in ihnen, wie 11, 21, 31. Ich versuchte grep ("\ D1 $", Namen (Liste)), aber nicht gehen. – bshor

Verwandte Themen