Подтвердить что ты не робот

Рекомбинация списка Data.frames в единый кадр данных

Прошу прощения, если на этот вопрос уже был дан ответ. Кроме того, это мой первый раз в stackoverflow.

У меня есть вопрос новичка R относительно списков, кадров данных и merge() и/или rbind().

Я начал с панели, которая выглядит как

COUNTRY YEAR VAR
A         1
A         2
B         1
B         2

Для повышения эффективности я создал список, который состоит из одного фрейма данных для каждой страны и выполнял различные вычисления для каждого отдельного data.frame. Однако, похоже, я не могу снова объединить отдельные кадры данных в один большой кадр.

rbind() и merge() оба говорят мне, что разрешена только замена элементов.

Может ли кто-нибудь сказать мне, что я делаю неправильно/и как на самом деле перекомпилировать кадры данных?

Спасибо

4b9b3361

Ответ 1

Возможно, вы хотите сделать что-то вроде:

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

Ответ 2

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)

Ответ 3

Там может быть лучший способ сделать это, но это, похоже, работает, и это просто. (Мой код имеет четыре строки, чтобы было легче увидеть шаги, эти четыре легко могли быть объединены.)

# 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

Ответ 4

plyr, вероятно, лучше всего. Другой полезный подход, если кадры данных могут быть разными, заключается в использовании изменения:

library(reshape)
data <- merge_recurse(listofdataframes)

Посмотрите мой ответ на этот связанный вопрос о слиянии фреймов данных.

Ответ 5

Заметим, что основное решение

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.