내가 병합 할 tibbles 목록 (길이 = 5000)이 있습니다. 그들은 모두 동일한 열을 가지고 있으므로 dplyr::bind_rows
을 사용하여 병합을 고려했습니다. 그것의 얼굴에 추가 된 tibble마다 행을 바인딩하는 것은 매우 빠릅니다. 그러나 더 많은 tibble이 추가됨에 따라 실행 시간은 선형 적으로 증가하는 대신 기하 급수적으로 증가합니다. 인터넷 검색을 수행 한 결과, 여기에있는 버그와 매우 비슷합니다 : https://github.com/tidyverse/dplyr/issues/1396. 버그가 bind_rows 내부에서 고쳐 졌다고해도, 나는 아직도 tibble 당 경과 시간이 기하 급수적으로 증가하는 것을보고있다.dplyr bind_rows 실행 시간 지수가
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")
왜 그런지, 어떻게 해결할 수 있습니까?
감사합니다. abhiieor의 의견을 확장하려면
행 단위로 증가하는 데이터 프레임이 비효율적입니다. 'data.table'는 당신을 여기서 더 잘 도울 수 있습니다. – abhiieor
필자는 오해의 소지가 있습니다 만,'purrr : reduce' 대신 직접 tibble에'bind_rows'를 사용할 수 없습니까? 그 변화에 따라 상황이 나에게 선형으로 보입니다. – aosmith
아니, 나는 오해 한 사람이었습니다. 당신이 그것을리스트에서 사용할 수 있는지 몰랐습니다. 고마워. 일이 전혀 끝나지 않았다. – biomiha