r- rollapply 跨多个文件数据库

r- rollapply across a mutiple file database

我有一个大型数据库,我已将其拆分为多个文件。每个文件都保存在同一个目录中,命名方案中有一个数字序列,以保持数据库的顺序。我这样做是为了减少加载和操作数据库所需的时间和内存。我想按顺序开始分析数据库,我打算使用类似 rollapply 的函数来完成。当我希望 window 一次跨越两个文件时,我遇到了问题。这是我需要帮助的地方。这是虚拟数据集,它将创建五个 CSV 文件,这些文件的命名方案与我的数据库相似:

library(readr)

val <- c(1,2,3,4,5)
df_1 <- data.frame(val)

write_csv(df_1, "1_database.csv", col_names = TRUE)
write_csv(df_1, "2_database.csv", col_names = TRUE)
write_csv(df_1, "3_database.csv", col_names = TRUE)
write_csv(df_1, "4_database.csv", col_names = TRUE)
write_csv(df_1, "5_database.csv", col_names = TRUE)

请记住,这个数据库很大,会导致我当前机器出现内存和时间问题。解决方案必须有一个 "forgets" 的组件。这意味着循环加入文件,或一次将它们全部加载到 R 环境中不是一种选择。加载新文件时,必须从 R 环境中删除最后一个文件。我一次最多可以加载三个文件。例如,可以加载文件 1-3,然后在加载文件 4 之前需要删除文件 1。

输出可以是所有文件的单个列表 - 文件 1-5 在单个列表中的组合。

为了简单起见,假设我想使用 2 的 window,并且我想计算这个 window 的平均值。我正在想象这样的事情(见下文)但这可能是一种失败的方法,我对任何事情都持开放态度。

appreciated_function <- function(x){

           Your greatly appreciated function
}

rollapply(df, 2, appreciated_function, by.column = FALSE, align = "left")

假设window宽度为k。遍历所有文件,并为每个文件读取该文件加上下一个文件的前 k-1 行(最后一行除外),然后在该文件上使用 rollapply 将我们得到的内容附加到到目前为止的内容。或者,如果输出太大,我们可以写出每个结果而不是附加它。

在底部我们检查它是否给出了预期的结果。

library(readr)
library(zoo)

val <- c(1,2,3,4,5)
df_1 <- data.frame(val)

write_csv(df_1, "1_database.csv", col_names = TRUE)
write_csv(df_1, "2_database.csv", col_names = TRUE)
write_csv(df_1, "3_database.csv", col_names = TRUE)
write_csv(df_1, "4_database.csv", col_names = TRUE)
write_csv(df_1, "5_database.csv", col_names = TRUE)

d <- dir(pattern = "database.csv$")

k <- 2
r <- NULL
for(i in seq_along(d)) {
   Next <- if (i != length(d)) read_csv(d[i+1], n_max = k-1)
   DF <- rbind(read_csv(d[i]), Next)
   r0 <- rollapply(DF, k, sum, align = "left")
   # if output too large replace next statement with one to write out r0
   r <- rbind(r, r0)
}

# check
r2 <- rollapply(data.frame(val = sequence(rep(5, 5))), k, sum, align = "left")
identical(r, r2)
## [1] TRUE