2010-03-06 7 views
22

Lo siento si esta pregunta ya ha sido respondida. Además, esta es mi primera vez en stackoverflow.Recombining una lista de Data.frames en un solo marco de datos

Tengo una pregunta para principiantes R sobre listas, marcos de datos y merge() y/o rbind().

empecé con un panel que tiene este aspecto

COUNTRY YEAR VAR 
A   1 
A   2 
B   1 
B   2 

Por razones de eficiencia, he creado una lista que consta de una trama de datos para cada país y lleva a cabo una variedad de cálculos en cada individuo data.frame. Sin embargo, parece que no puedo combinar los marcos de datos individuales en un marco grande de nuevo.

rbind() y merge() ambos me dicen que solo se permite el reemplazo de elementos.

¿Podría alguien decirme qué estoy haciendo mal/y cómo recombinar realmente los marcos de datos?

Gracias

Respuesta

4

puede haber una mejor manera de hacer esto, pero esto parece que funciona y es sencillo. (Mi código tiene cuatro líneas para que sea más fácil ver los pasos, los cuales cuatro podrían combinarse fácilmente.)

# first re-create your data frame: 
A = matrix(ceiling(10*runif(8)), nrow=4) 
colnames(A) = c("country", "year_var") 
dfa = data.frame(A) 

# now re-create the list you made from the individual rows of the data frame: 
df1 = dfa[1,] 
df2 = dfa[2,] 
df3 = dfa[3,] 
df4 = dfa[4,] 
df_all = list(df1, df2, df3, df4) 

# to recreate your original data frame: 
x = unlist(df_all)   # from your list create a single 1D array 
A = matrix(x, nrow=4)  # dimension that array in accord w/ your original data frame 
colnames(A) = c("country", "year_var")  # put the column names back on 
dfa = data.frame(A)  # from the matrix, create your original data frame 
+0

Gracias por el guión. Funcionó bastante bien, mi única preocupación con esto es que no se actualiza automáticamente si tuviera que agregar un país. (Aunque supongo que con un bucle for podría hacerlo, también) – CGN

33

Tal vez usted quiere hacer algo como:

do.call("rbind", my.df.list)

+0

Desafortunadamente, esto devuelve un error (creo que porque no todos los paneles están balanceados?) De cualquier manera, el comando anterior funcionó. Gracias de cualquier forma. – CGN

+0

Esa solución funciona, pero es lenta – Kots

3

plyr es probablemente mejor. Otro enfoque útil si las tramas de datos pueden ser diferentes es utilizar reshape:

library(reshape) 
data <- merge_recurse(listofdataframes) 

mirada en mi respuesta a this related question on merging data frames.

5

Tenga en cuenta que la solución básica

do.call("rbind", my.df.list) 

será lenta si tenemos muchas tramas de datos. Una solución escalable es:

library(data.table) 
rbindlist(my.df.list) 

que, desde el docs, es la dplyr same as do.call("rbind", l) on data.frames, but much faster.

5

le permite utilizar la función bind_rows para ello:

library(dplyr) 

foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)), 
     df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6))) 

bind_rows(foo) 
Cuestiones relacionadas