dplyr bind_rows执行时间指数

时间:2017-11-29 15:16:58

标签: r dplyr purrr

我有一个我希望合并的列表(长度= 5000)。他们都有相同的列,所以我想到使用dplyr::bind_rows进行合并。从表面上看,每个添加的tibble的绑定行非常快,但是随着更多的元素的添加,执行时间呈指数增长而不是线性增加。 做了一些谷歌搜索,这非常像在这里观察到的错误:https://github.com/tidyverse/dplyr/issues/1396。即使错误应该在bind_rows内部修复,我仍然看到每个tibble的经过时间呈指数增长。

library(foreach)
library(tidyverse)
set.seed(123456)
tibbles <- foreach(i = 1:200) %do% {
              tibble(a = rnorm(10000), 
                     b = rep(letters[1:25], 400), 
                     c = rnorm(10000))
}
times <- foreach(i = 1:200) %do% {
            system.time(tibbles[1:i] %>% 
                            purrr::reduce(bind_rows))
}

times %>% 
     map_dbl(.f = ~.x[3]) %>% 
     plot(ylab = "time [s] per added tibble")

为什么会出现这种情况以及如何解决这个问题?

感谢。

elapsed_time

1 个答案:

答案 0 :(得分:0)

为了扩展abhiieor的评论,我认为data.table中的rbindlistrbind可能会有所帮助。假设您正在尝试绑定一系列元素(或data.tables)的行,这段代码几乎是即时的。

time <- proc.time()

data_tables <- foreach(i = 1:200) %do% {
  data.table(a = rnorm(10000), 
         b = rep(letters[1:25], 400), 
         c = rnorm(10000))
}

all_tables <- rbindlist(data_tables)

end_time <- proc.time() -  time