Ответ 1
Возможно, вы хотите сделать что-то вроде:
do.call("rbind", my.df.list)
Прошу прощения, если на этот вопрос уже был дан ответ. Кроме того, это мой первый раз в stackoverflow.
У меня есть вопрос новичка R относительно списков, кадров данных и merge()
и/или rbind()
.
Я начал с панели, которая выглядит как
COUNTRY YEAR VAR
A 1
A 2
B 1
B 2
Для повышения эффективности я создал список, который состоит из одного фрейма данных для каждой страны и выполнял различные вычисления для каждого отдельного data.frame
. Однако, похоже, я не могу снова объединить отдельные кадры данных в один большой кадр.
rbind()
и merge()
оба говорят мне, что разрешена только замена элементов.
Может ли кто-нибудь сказать мне, что я делаю неправильно/и как на самом деле перекомпилировать кадры данных?
Спасибо
Возможно, вы хотите сделать что-то вроде:
do.call("rbind", my.df.list)
dplyr позволяет вам использовать функцию bind_rows для этого:
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)
Там может быть лучший способ сделать это, но это, похоже, работает, и это просто. (Мой код имеет четыре строки, чтобы было легче увидеть шаги, эти четыре легко могли быть объединены.)
# 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
plyr, вероятно, лучше всего. Другой полезный подход, если кадры данных могут быть разными, заключается в использовании изменения:
library(reshape)
data <- merge_recurse(listofdataframes)
Посмотрите мой ответ на этот связанный вопрос о слиянии фреймов данных.
Заметим, что основное решение
do.call("rbind", my.df.list)
будет медленным, если у нас много данных. Масштабируемое решение:
library(data.table)
rbindlist(my.df.list)
который из docs является same as do.call("rbind", l) on data.frames, but much faster.