insertar - Recombining una lista de Data.frames en un solo marco de datos
filtrar datos en r (5)
Esta pregunta ya tiene una respuesta aquí:
Lo siento si esta pregunta ya ha sido respondida. Además, esta es mi primera vez en stackoverflow.
Tengo una pregunta para principiantes R sobre listas, marcos de datos y merge()
y / o rbind()
.
Empecé con un Panel que se parece a esto
COUNTRY YEAR VAR
A 1
A 2
B 1
B 2
Para fines de eficiencia, creé una lista que consta de un marco de datos para cada país y data.frame
una variedad de cálculos en cada data.frame
individual. Sin embargo, parece que no puedo combinar los marcos de datos individuales en un marco grande de nuevo.
rbind()
y merge()
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
Puede haber una forma mejor de hacer esto, pero parece que funciona y es sencillo. (Mi código tiene cuatro líneas para que sea más fácil ver los pasos, estos 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
Tal vez quieras hacer algo como:
do.call("rbind", my.df.list)
Tenga en cuenta que la solución básica
do.call("rbind", my.df.list)
será lento si tenemos muchos dataframes. Una solución escalable es:
library(data.table)
rbindlist(my.df.list)
que, desde los docs , es lo same as do.call("rbind", l) on data.frames, but much faster.
dplyr le permite usar la función bind_rows para eso:
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)
plyr es probablemente el mejor. Otro enfoque útil si los marcos de datos pueden ser diferentes es usar remodelar:
library(reshape)
data <- merge_recurse(listofdataframes)
Mira mi respuesta a esta pregunta relacionada sobre la fusión de marcos de datos .