2009-10-30 18 views
18

Ho una lista di liste che assomigliano a questa: x[[state]][[year]]. Ogni elemento di questo è un frame di dati, e accedervi individualmente non è un problema.rbind dataframes in una lista di liste

Tuttavia, mi piacerebbe rbind data frame su più elenchi. Più specificamente, mi piacerebbe avere come risultato quanti più frame di dati quanti anni ho, cioè rbind tutti i frame di dati di stato all'interno di ogni anno. In altre parole, mi piacerebbe combinare tutti i miei dati di stato, anno dopo anno, in frame di dati separati.

So che posso combinare una singola lista in un frame di dati con do.call("rbind",list). Ma non so come posso farlo attraverso liste di liste.

+2

Per curiosità, perché stai trattando con i dati in questo modo, piuttosto che avere una grande cornice di dati con tutti i dati? –

risposta

6

si può fare qualcosa secondo le seguenti linee (non ho potuto testare come non ho tale struttura):

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))) 

L'anno estratto funzione crea una lista contenente solo i dataframes per l'anno data. Poi li rbind ...

+2

Le cose si sono complicate con la risposta sopra, quindi ho provato il tuo approccio, che ha funzionato! Con una piccola modifica. La prima riga ha restituito il dataframe che stavo cercando. La seconda linea non ha funzionato, quindi mi sono rivolto al pacchetto plyr di Hadley. Questo comando restituisce perfettamente un elenco di datafram rbinded dopo la prima riga: llply (my.list.of.years, function (my.year) do.call (rbind, extract.year (my.year))) Fantastico, grazie ragazzi per l'aiuto! – bshor

+1

ldply() è ancora più veloce e più efficiente! – bshor

32

Collapse in una lista prima:

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

Grazie per l'aiuto rapido! Ma questo non è esattamente quello che voglio. La tua risposta mi dà un SINGLE dataframe di tutti i frame di dati all'interno della lista di liste (usando unlist, un comando interessante che non ho mai saputo). Ma mi piacerebbe una lista di 32 frame di dati rbind'ed, che sono tanti anni quanti ne ho, che uniscono tutti gli stati insieme. La prima riga delle tue risposte mi fornisce una lista di durata di circa lo * anno (anche se per qualche ragione ottengo la lunghezza = 1584, non 32 * 50 = 1600 come mi aspetterei). Quindi penso che sia un indizio ... – bshor

+0

Dopo qualche esperimento in più, penso di essere arrivato da qualche parte. Ho nominato gli elementi della lista di stati per la prima volta, così ora gli elementi della lista non elencata (dopo il primo comando di Hadley) ora hanno nomi utili come "AL3" e "TX4". Ora devo combinare tutti i 3 insieme, tutti i 4, e così via. – bshor

+0

Oh ragazzo, immagino che le espressioni regolari facciano parte della risposta. Ho provato grep ("1 $", nomi (lista)) per ottenere gli elenchi che hanno un "1" ma che mi fanno tutti gli anni con un 1 in loro, come 11, 21, 31. Ho provato grep ("\ D1 $", nomi (elenco)) ma non andare. – bshor

Problemi correlati