我知道在这里有很多关于使用do.call或ldply将data.frames列表转换为单个data.frame的方法,但这个问题是关于理解两种方法的内部工作方式并试图找出原因我无法将两个相同结构,相同字段名称等近100万个df的列表连接到一个data.frame中 . 每个data.frame都是一行和21列 .
数据以JSON文件开头,我使用fromJSON转换为列表,然后运行另一个lapply来提取列表的一部分并转换为data.frame,最后得到一个data.frames列表 .
我试过了:
df <- do.call("rbind", list)
df <- ldply(list)
但我不得不在让它运行3个小时并且没有得到任何回报之后终止这个过程 .
有更有效的方法吗?我怎样才能解决正在发生的事情以及为什么需要这么长时间?
仅供参考 - 我在使用RHEL的72GB四核服务器上使用RStudio服务器,所以我认为内存不是问题所在 . sessionInfo如下:
> sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: x86_64-redhat-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] multicore_0.1-7 plyr_1.7.1 rjson_0.2.6
loaded via a namespace (and not attached):
[1] tools_2.14.1
>
4 回答
鉴于您正在寻找性能,似乎应该建议一个
data.table
解决方案 .有一个函数
rbindlist
这是same
但比do.call(rbind, list)
快得多对于
data.frame
的列表,它也快 very为了比较
还有一些适当的基准测试
并反对@ JoshuaUlrich的解决方案
我不确定你真的需要使用
as.data.frame
,因为data.table
继承了类data.frame
rbind.data.frame
做了很多你不需要的检查 . 如果你只做你想做的事情,这应该是一个非常快速的转变 .受data.table答案的启发,我决定试着让它更快 . 这是我更新的解决方案,尝试保留复选标记 . ;-)
您观察到所花费的时间随着data.frames的数量呈指数增长,这表明将_2521964分为两个阶段会加快速度 .
这个简单的实验似乎证实了这是一条非常富有成效的道路:
您有一个data.frames列表,每个都有一行 . 如果可以将每个转换为矢量,我认为这会加快速度 .
但是,假设它们需要是data.frames,我'll create a function with code borrowed from Dominik'的回答是Can rbind be parallelized in R?
我已经使用这个功能好几个月了,并发现它比
do.call(rbind, ...)
更快,使用更少的内存[免责声明是我几乎只在xts
对象上使用它]每个data.frame拥有的行越多,列表所包含的元素越多,此功能就越有用 .
如果您有100,000个数字向量的列表,
do.call(rbind, ...)
会更好 . 如果你有10亿的长度列表,这将更好 .随着您增加列表的长度,相对加速将呈指数级增长 .