2012-09-04 15 views
10

È possibile avere più frame di dati da memorizzare in una struttura di dati e elaborarli successivamente da ciascun frame di dati? cioè esempioMemorizzazione di più frame di dati in una struttura di dati - R

df1 <- data.frame(c(1,2,3), c(4,5,6)) 
df2 <- data.frame(c(11,22,33), c(44,55,66)) 

.. poi desidero farli aggiunto in una struttura di dati, in modo tale che posso ciclo attraverso quella struttura di dati recuperato ciascun frame di dati uno alla volta e di processo, qualcosa come

for (iterate through the data structure) # this gives df1, then df2 
{ 
    write data frame to a file 
} 

Non riesco a trovare alcuna struttura dati di questo tipo in R. Qualcuno può indicarmi un codice che illustri la stessa funzionalità?

risposta

11

Basta inserire lo data.frames in un elenco. Un vantaggio è che uno list funziona davvero bene con i loop di stile apply. Ad esempio, se si desidera salvare i data.frame di, è possibile utilizzare mapply:

l = list(df1, df2) 
mapply(write.table, x = l, file = c("df1.txt", "df2.txt")) 

Se vi piace apply loop di stile (e si, fiducia in me :)) si prega di dare un'occhiata al pacchetto epico plyr . Potrebbe non essere il pacchetto più veloce (guarda data.table per veloce), ma gocciola con zucchero sintattico.

+0

Mi picchia! Puoi anche "iterare" attraverso l'elenco di data.frames con 'lapply'. – Justin

+0

Potrebbe essere utile aggiungere una riga o due di codice, come la risposta di @ Justin, solo per completezza. – joran

+0

Ho aggiunto un esempio di come usare 'mapply' per salvare i dati.frames usando' write.table'. –

8

Gli elenchi possono essere utilizzati per tenere quasi tutto, tra cui data.frame s:

## Versatility of lists 
l <- list(file(), new.env(), data.frame(a=1:4)) 

Per la scrittura di più oggetti di dati memorizzati in un elenco, lapply() è tuo amico:

ll <- list(df1=df1, df2=df2) 
## Write out as *.csv files 
lapply(names(ll), function(X) write.csv(ll[[X]], file=paste0(X, ".csv"))) 
## Save in *.Rdata files 
lapply(names(ll), function(X) { 
    assign(X, ll[[X]]) 
    save(list=X, file=paste0(X, ".Rdata")) 
}) 
+0

+1 e l'elenco può contenere anche oggetti radicalmente diversi, come un 'data.frame' come primo elemento, un' list' come secondo elemento e il risultato di 'lm' come terzo oggetto. –

+0

@PaulHiemstra - Sono contento che non ti dispiaccia se aggiungo questo. So solo che tempo fa quei costrutti di scrittura di file sarebbero stati per me quando ero un neofita della R ... –

5

Cosa sei cercando è un list. È possibile utilizzare una funzione come lapply per trattare ciascuno dei frame di dati nello stesso modo. Tuttavia, potrebbero esserci casi in cui è necessario passare l'elenco di frame di dati a una funzione che gestisce i frame di dati in relazione l'uno con l'altro. In questo caso, lapply non ti aiuta.

Ecco perché è importante notare come è possibile accedere e iterare i frame di dati nel proprio elenco. È così:

mylist[[data frame]][row,column] 

Nota le doppie parentesi attorno all'indice del frame di dati. Così, per il vostro esempio sarebbe

df1 <- data.frame(c(1,2,3), c(4,5,6)) 
df2 <- data.frame(c(11,22,33), c(44,55,66)) 
mylist<-list(df1,df2) 

mylist[[1]][1,2] sarebbero tornati 4, mentre mylist[1][1,2] sarebbe restituire NULL. Mi ci è voluto un po 'per trovarlo, quindi ho pensato che potesse essere utile postare qui.

Problemi correlati