我有一些代码,在一个地方最终得到一个数据帧列表,我真的想转换为一个大数据帧 .
我从earlier question得到了一些指示,它试图做类似但更复杂的事情 .
这是我开始的一个例子(为了说明,这是非常简化的):
listOfDataFrames <- vector(mode = "list", length = 100)
for (i in 1:100) {
listOfDataFrames[[i]] <- data.frame(a=sample(letters, 500, rep=T),
b=rnorm(500), c=rnorm(500))
}
我目前正在使用这个:
df <- do.call("rbind", listOfDataFrames)
9 回答
使用dplyr包中的bind_rows():
另一个选择是使用plyr函数:
这比原来慢一点:
我的猜测是使用
do.call("rbind", ...)
将是你将找到的最快的方法,除非你可以做一些事情,比如(a)使用矩阵而不是data.frames和(b)预先分配最终矩阵并分配给它而不是增长它 .编辑1:
基于Hadley 's comment, here'的CRAN的最新版本
rbind.fill
:这比rbind更容易,并且速度稍快(这些时间在多次运行中保持不变) . 据我了解,the version of plyr on github甚至比这更快 .
想要比较一些最近答案的人的更新视觉(我想比较purrr和dplyr解决方案) . 基本上我结合了@TheVTM和@rmf的答案 .
码:
会话信息:
包版本:
这是另一种方法可以完成(只需将其添加到答案中,因为
reduce
是一个非常有效的功能工具,经常被忽略作为循环的替代 . 在这种特殊情况下,这些都不比do.call快得多)使用基数R:
或者,使用tidyverse:
如何在tidyverse中完成:
为了完整起见,我认为这个问题的答案需要更新 . “我的猜测是使用
do.call("rbind", ...)
将是你会发现的最快的方法......”2010年5月和之后的某个时间可能是这样,但在2011年9月左右,data.table
包中引入了新功能rbindlist
1.8.2,注释“这与do.call("rbind",l)
相同,但更快” . 多快了?dplyr
中也有bind_rows(x, ...)
.码:
Session :
UPDATE :重新运行2018年1月31日 . 跑在同一台电脑上 . 新版本的包 . 为种子爱好者添加种子 .
缺少
data.table
的解决方案唯一缺少的是标识符列,用于了解数据来自列表中的哪个数据帧 .像这样的东西:
idcol
参数添加一列(.id
),用于标识列表中包含的数据框的来源 . 结果看起来像这样: