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()
循环中增长的东西是一个坏主意,但我不知道如何进行这种操作。我错过了什么?可能是非常简单的事情。
答案 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"))