我有一个名为prebindgames
的列表,其中有200万个条目。每个列表条目都是一个具有6列的单行数据框。为了了解每一列中的数据类型,每个数据帧的格式为:
data.frame(Time = double(),
HScore = numeric(),
AScore = numeric(),
HTeam = character(),
ATeam = character(),
GameID = character(),
stringsAsFactors = FALSE)
数字列不超过千,字符列不超过10个字符。我尝试运行do.call(rbind, prebindgames)
,它运行了一整夜,没有停止的迹象。我再次尝试了一些较小的值:
start_time <- Sys.time()
allgamespbp <- do.call(rbind, prebindgames[1:1000])
end_time <- Sys.time()
print(end_time - start_time)
Time difference of 1.059694 secs
prebindgames[1:10000]
Time difference of 11.00168 secs
prebindgames[1:20000]
Time differences of 37.30913 secs
所以我已经看到了指数级的增长,这可以解释为什么在一次呼叫中将所有200万个绑定在一起时事情变得一发不可收拾。所以我的三个问题是:
1)这正常吗?如果我将预期速度基于包含1万个条目的列表,那么200万只需要40分钟左右
2)我该怎么做才能加快此过程?据我所知,替换设置长度列表中的值然后使用do.call是将行绑定在一起的最有效方法。
3)如果在不对我的代码或设备进行重大更改的情况下,只要我能尽快获得它,我是否可以对其进行修改以查看进度?
背景:这是一个网络抓取项目,我将把许多NBA游戏的得分合并到一张大桌子上。完整的代码可以在这里找到:https://github.com/NicholasHassan/NBAComeback
如果对此感到好奇,可以跳至NBA Comeback.R
的第54行,然后使用pbpurls.csv
查看抓取过程是什么样的。
答案 0 :(得分:3)
这听起来像是data.table可能大大快(100-1000x)的情况。
https://www.r-bloggers.com/concatenating-a-list-of-data-frames/
Is there a higher order replacement for do.call(rbind, ...)?
好奇如果您将上述替换为:
allgamespbp <- data.table::rbindlist(prebindgames[1:1000])