#r #tidyverse
Вопрос:
У меня есть около 400 000 объектов, которые имеют id
и специфический status
. Каждый день (365 дней в году) создается файл состояния следующим образом:
Пример файла состояния:
n = 400000
df <- data.frame(id = sample(200000000000:299999999999, size = n, replace = FALSE),
status = sample( seq(100, 900, 10), size = n, replace = TRUE))
time <- paste0(Sys.Date(), "_", format(Sys.time(), "%H%M"))
writexl::write_xlsx(df, paste0("status_", time, ".xlsx"))
Теперь мой вопрос: как я могу наиболее эффективно собрать эти файлы вместе, чтобы я мог анализировать развитие определенного статуса с течением времени? Чтобы сэкономить немного памяти, я не создавал переменную даты в каждом файле состояния, так как она была бы одинаковой для всех случаев (дата указана только в имени файла).
Один файл состояния составляет около 6 или 7 МБ, так что за год это составит около 2,5 ГБ.
Комментарии:
1. Вы подумывали о том , чтобы преобразовать их в
csv
, а затем прочитать ихdata.table::fread()
? Это два шага, ноdata.table::fread
на сегодняшний день это самый эффективный доступный читатель.
Ответ №1:
Самый простой способ-перечислить файлы, затем прочитать их, а затем присоединиться к ним.
Так что вы могли бы сделать что-то вроде этого:
dir <- "path to directory"
files <- list.files(dir, full.names = TRUE)
# can change based on file type (if you convert to csv, you can use data.table::fread)
data <- purrr::map(files, readxl::read_excel)
# you'll probably want the date of each
dates <- dir %>% list.files() %>% stringr::str_remove(".xlsx") %>% stringr::str_remove("status_")
data <- purrr::map2(files, data, ~ mutate(.x, status = rep_len(.y, nrow(.x))
data_join <- purrr::reduce(data, rbind)
# you might want to convert the dates into date-times, here's an example
data_join <- data_join %>% separate(dates, into = c("date", "time"), by = "_") %>% mutate(date = lubridate::ymd(date), time = lubridate::hm(time)) %>% mutate(date_time = date time)
Возможно, это не самое быстрое решение в R, но оно одно из самых быстрых для запуска из файлов Excel.