如果这个问题已经得到解答,我很抱歉.另外,这是我第一次使用stackoverflow.
我有一个关于列表,数据框merge()和/或的初学者R问题rbind().
我开始使用看起来像这样的Panel
COUNTRY YEAR VAR
A 1
A 2
B 1
B 2
Run Code Online (Sandbox Code Playgroud)
为了提高效率,我创建了一个列表,其中包含每个国家/地区的一个数据框,并对每个国家/地区执行了各种计算data.frame.但是,我似乎无法将各个数据帧再次组合成一个大帧.
rbind()并merge()告诉我只允许更换元素.
有人能告诉我我做错了什么以及如何重新组合数据帧?
谢谢
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)
Run Code Online (Sandbox Code Playgroud)
注意基本的解决方案
do.call("rbind", my.df.list)
Run Code Online (Sandbox Code Playgroud)
如果我们有很多数据帧,那么会很慢.可扩展的解决方案是:
library(data.table)
rbindlist(my.df.list)
Run Code Online (Sandbox Code Playgroud)
从文档来看,它是same as do.call("rbind", l) on data.frames, but much faster.
可能有更好的方法来做到这一点,但这似乎有效而且很简单。(我的代码有四行,以便更容易查看步骤;这四行可以轻松组合。)
# 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
Run Code Online (Sandbox Code Playgroud)