R эффективно связывает множество строк данных, хранящихся на жестком диске - PullRequest
1 голос
/ 29 января 2020

У меня примерно 50000 .rda файлов. Каждый содержит фрейм данных с именем results с ровно одной строкой. Я хотел бы добавить их все в один кадр данных.

Я попробовал следующее, которое работает, но медленно:

root_dir <- paste(path, "models/", sep="")
files <- paste(root_dir, list.files(root_dir), sep="")
load(files[1])
results_table = results
rm(results)

for(i in c(2:length(files))) {
  print(paste("We are at step ", i,sep=""))
  load(files[i])
  results_table= bind_rows(list(results_table, results))
  rm(results)
}

Есть ли более эффективный способ сделать это?

Ответы [ 2 ]

1 голос
/ 29 января 2020

Использование .rds немного проще. Но если мы ограничены .rda, следующее может быть полезным. Я не уверен, что это быстрее, чем вы сделали:

library(purrr)
library(dplyr)
library(tidyr)

## make and write some sample data to .rda
x <- 1:10

fake_files <- function(x){
  df <- tibble(x = x)
  save(df, file = here::here(paste0(as.character(x),
                                    ".rda")))
  return(NULL)
}

purrr::map(x,
           ~fake_files(x = .x))

## map and load the .rda files into a single tibble

load_rda <- function(file) {
  foo <- load(file = file) # foo just provides the name of the objects loaded
  return(df) # note df is the name of the rda returned object
}

rda_files <- tibble(files = list.files(path = here::here(""),
                                pattern = "*.rda",
                                full.names = TRUE)) %>%
  mutate(data = pmap(., ~load_rda(file = .x))) %>%
  unnest(data)

0 голосов
/ 29 января 2020

Это непроверенный код, но он должен быть довольно эффективным:

root_dir <- paste(path, "models/", sep="")
files <- paste(root_dir, list.files(root_dir), sep="")

data_list <- lapply("mydata.rda", function(f) {
  message("loading file: ", f)
  name <- load(f)                    # this should capture the name of the loaded object
  return(eval(parse(text = name)))   # returns the object with the name saved in `name`
})

results_table <- data.table::rbindlist(data_list)

data.table::rbindlist очень похож на dplyr::bind_rows, но немного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...