37

如果这个问题已经得到回答,我很抱歉。另外,这是我第一次使用stackoverflow。

merge()我有一个关于列表、数据框和/或的初学者 R 问题rbind()

我从一个看起来像这样的面板开始

COUNTRY YEAR VAR
A         1
A         2
B         1
B         2

为了提高效率,我创建了一个列表,其中包含每个国家/地区的一个数据框,并对每个人进行了各种计算data.frame。但是,我似乎无法再次将单个数据帧组合成一个大帧。

rbind()并且merge()都告诉我只允许替换元素。

有人可以告诉我我做错了什么/以及如何实际重新组合数据框吗?

谢谢

4

5 回答 5

39

也许你想做类似的事情:

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

于 2010-03-06T17:16:10.500 回答
13

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)
于 2016-12-07T11:04:59.353 回答
10

请注意,基本解决方案

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

如果我们有很多数据帧,将会很慢。一个可扩展的解决方案是:

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

其中,从文档中,是same as do.call("rbind", l) on data.frames, but much faster.

于 2016-05-12T17:06:40.723 回答
4

plyr 可能是最好的。如果数据框可能不同,另一种有用的方法是使用 reshape:

library(reshape)
data <- merge_recurse(listofdataframes)

查看我对有关合并数据框的相关问题的回答。

于 2010-03-06T18:19:20.700 回答
4

可能有更好的方法可以做到这一点,但这似乎可行而且很简单。(我的代码有四行,以便更容易查看步骤;这四行可以轻松组合。)

# 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
于 2010-03-06T15:52:59.103 回答