2012-09-04 10 views
10

¿Es posible tener múltiples tramas de datos para almacenar en una estructura de datos y procesarlas luego en cada trama de datos? es decir, ejemploAlmacenamiento de varias tramas de datos en una estructura de datos: R

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

.. entonces me gustaría han ellos añadido en una estructura de datos, de manera que pueda bucle a través de esa estructura de datos la recuperación de cada trama de datos de una en una y procesarla, algo así como

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

No encuentro ninguna estructura de datos en R. ¿Alguien me puede indicar algún código que ilustre la misma funcionalidad?

Respuesta

11

Simplemente ponga el data.frames en una lista. Una ventaja es que un list funciona muy bien con los lazos de estilo apply. Por ejemplo, si desea guardar la década de data.frame, puede utilizar mapply:

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

Si te gusta apply bucles de estilo (y usted, confía en mí :)) favor, eche un vistazo a la plyr paquete épica . Puede que no sea el paquete más rápido (mira data.table para rápido), pero gotea con azúcar sintáctica.

+0

Batirme! También puede "iterar" a través de su lista de data.frames con 'lapply'. – Justin

+0

Puede valer la pena agregar una o dos líneas de código, como la respuesta de @ Justin, solo para completar. – joran

+0

Agregué un ejemplo de cómo usar 'mapply' para guardar los data.frames usando' write.table'. –

8

Las listas pueden ser usados ​​para sostener casi cualquier cosa, incluyendo data.frame s:

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

Para escribir múltiples objetos de datos almacenados en una lista, lapply() es su amigo:

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, y la lista incluso puede contener objetos radicalmente diferentes, como 'data.frame' como primer elemento,' lista' como segundo elemento y el resultado de 'lm' como tercer objeto. –

+0

@PaulHiemstra - Me alegro de que no te moleste que agregue esto. Solo sé lo que ahorraría tiempo que esos constructos de escritura de archivos hubieran sido para mí cuando era un R neófito ... –

5

Lo que eres buscando es un list. Puede usar una función como lapply para tratar cada uno de sus marcos de datos de la misma manera sperately. Sin embargo, puede haber casos en los que deba pasar su lista de marcos de datos a una función que maneje los marcos de datos en relación entre sí. En este caso, lapply no lo ayuda.

Es por eso que es importante tener en cuenta cómo puede acceder e iterar los marcos de datos en su lista. Se hace así:

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

Tenga en cuenta los doble corchetes alrededor del índice de su marco de datos. Así que para su ejemplo sería

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] volverían 4, mientras que mylist[1][1,2] volvería NULL. Me tomó un tiempo encontrar esto, así que pensé que podría ser útil publicarlo aquí.

Cuestiones relacionadas