r- rollapply跨越多个文件数据库

时间:2018-01-02 01:13:14

标签: r database rollapply

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

desc "Command help", "Longer command description"
def package_all
  puts "Packing..."
end
map "package-all" => "package_all"

请记住,此数据库非常庞大,并且会导致当前计算机出现内存和时间问题。解决方案必须有一个“忘记"”的组件。这意味着反复加入文件,或者将它们全部加载到R环境中是不可取的。加载新文件时,必须从R环境中删除最后一个文件。我一次最多可以加载三个文件。例如,可以加载文件1-3,然后在加载文件4之前需要删除文件1。

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

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

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)

1 个答案:

答案 0 :(得分:1)

假设窗口宽度为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