读取和绑定多个数据帧的更好方法

时间:2017-11-01 16:43:03

标签: r for-loop

for()中的{p> R循环似乎总是在多种情况下阅读,但必须有更好的方法来做我想做的事。

假设我有几个数据集都来自自动数据拉取系统:

#Fake data set up
library(lubridate)

dir_path <- tempdir()
file_1 <- paste0(Sys.Date() - days(2), ".rds")
file_2 <-paste0(Sys.Date() - days(1), ".rds")
file_3 <- paste0(Sys.Date(), ".rds")

data.frame(thing = rnorm(100)) %>%
    saveRDS(file.path(dir_path, file_1))

data.frame(thing = rnorm(100)) %>%
    saveRDS(file.path(dir_path, file_2))

data.frame(thing = rnorm(100)) %>%
    saveRDS(file.path(dir_path, file_3))

我想将这些内容读入我的R会话,对每个会话执行一些处理,然后将它们全部放在同一个数据帧中:

read_in_data <- function(file_name, dir){

    d <- substr(file_name, 1, 10)
    thing <- 
        readRDS(file.path(dir, file_name)) %>%
        mutate(date = d)
}

files <- list.files(temp_dir(), pattern = "^2017-1")

this_thing <- NULL

for(i in 1:length(files)){
    this_thing <- 
        this_thing %>%
        bind_rows(read_in_data(files[i], dir_path))
}

这很棒,完全符合我的要求,但我有一种潜在的怀疑,即随着我想要读入并绑定在一起的文件数量的增加,for()循环将变得非常慢。

我可以做类似

的事情
this_thing <- 
    read_in_data(files[1], dir_path) %>%
    bind_rows(read_in_data(files[2], dir_path)) %>%
    bind_rows(read_in_data(files[3], dir_path))

但这很糟糕,无法维护,特别是当我想要阅读的文件数量增加时。

如何摆脱这个for循环?我知道在for()循环中增长的东西是一个坏主意,但我不知道如何进行这种操作。我错过了什么?可能是非常简单的事情。

1 个答案:

答案 0 :(得分:0)

我最终使用了purrr包:

library(purrr)

files %>%
    map(safely(read_in_data, quiet = FALSE)) %>%
    transpose() %>%
    simplify_all() %>%
    .result() %>%
    bind_rows() %>%
    saveRDS(file.path("path to .rds file"))