R-do.call(rbind,...)

时间:2018-09-08 23:58:27

标签: r dataframe optimization rbind do.call

我有一个名为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查看抓取过程是什么样的。

1 个答案:

答案 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])