gpt4 book ai didi

r- rollapply 跨多个文件数据库

转载 作者:搜寻专家 更新时间:2023-10-30 23:32:09 24 4
gpt4 key购买 nike

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

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

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

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

appreciated_function <- function(x){

Your greatly appreciated function
}

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

最佳答案

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

关于r- rollapply 跨多个文件数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48054552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com