我有一个我希望合并的列表(长度= 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")
为什么会出现这种情况以及如何解决这个问题?
感谢。
答案 0 :(得分:0)
为了扩展abhiieor的评论,我认为data.table中的rbindlist
或rbind
可能会有所帮助。假设您正在尝试绑定一系列元素(或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