gpt4 book ai didi

r - 打包大数据集

转载 作者:行者123 更新时间:2023-12-01 22:57:52 24 4
gpt4 key购买 nike

Column-wise storage in the inst/extdata directory of a package, as suggested by Jan, is now implemented in the dfunbind package.

我正在使用 data-raw idiom使从原始数据到结果的整个分析具有可重复性。为此,数据集首先包装在 R 包中,然后可以使用 library() 加载。 .

我使用的数据集之一较大,大约有 800 万个观察值,大约有 80 个属性。对于我当前的分析,我只需要一小部分属性,但无论如何我想打包整个数据集。

现在,如果它只是打包为数据框(例如,使用 devtools::use_data() ),则在第一次访问它时将完整加载它。打包此类数据以便我可以在列级别延迟加载的最佳方法是什么? (仅加载我实际访问的那些列,其他列很乐意保留在磁盘上并且不占用 RAM。) ff package 会吗?帮助?谁能给我一个可行的例子吗?

最佳答案

我想,我会将数据存储在inst/extdata中。然后在包中创建几个可以读取和返回部分数据的函数。在您的函数中,您可以使用以下方法获取数据的路径:system.file("extdata", "yourfile", package = "yourpackage")。 (如您链接到的页面上所示)。

接下来的问题是以什么格式存储数据,以及如何在不读取内存中数据的情况下从中获取选择。为此,有很多选择。举几个例子:

  • sqlite:将数据存储在 sqlite 数据库中。然后,您可以使用 rsqlite 包对此数据执行查询。
  • ff:将数据存储在 ff 对象中(例如使用 ffbase 中的 save.ffdf 函数保存;使用load.ffdf再次加载)。 ff 不能很好地处理字符字段(它们总是转换为因子)。理论上,这些文件不是跨平台的,尽管只要您停留在英特尔平台上就应该没问题。
  • CSV:将数据存储在普通的旧 csv 文件中。然后,您可以使用 LaF 包从此文件中进行选择。性能可能会低于 ff,但可能已经足够好了。
  • RDS:将每个列存储在单独的 RDS 文件中(使用 saveRDS)并使用 readRDS 加载它们,优点是您不依赖于任何 R 包。这很快。缺点是您无法进行行选择(但情况似乎并非如此)。

如果您只想选择列,我会选择 RDS。

使用 RDS 的粗略示例

以下代码创建一个包含 iris 数据集的示例包:

load_data <- function(dataset, columns) { 
result <- vector("list", length(columns));
for (i in seq_along(columns)) {
col <- columns[i]
fn <- system.file("extdata", dataset, paste0(col, ".RDS"), package = "lazydata")
result[[i]] <- readRDS(fn)
}
names(result) <- columns
as.data.frame(result)
}

store_data <- function(package, name, data) {
dir <- file.path(package, "inst", "exdata", name)
dir.create(dir, recursive = TRUE)
for (col in names(data)) {
saveRDS(data[[col]], file.path(dir, paste0(col, ".RDS")))
}
}

packagename <- "lazyload"
package.skeleton(packagename, "load_data")
store_data(packagename, "iris", iris)

构建并安装包后(您需要修复文档,例如删除它),您可以执行以下操作:

library(lazyload)
data <- load_data("iris", "Sepal.Width")

加载虹膜数据集的Sepal.Width列。

当然,这是load_data的一个非常简单的实现:没有错误处理,它假设所有列都存在,它不知道存在哪些列,它不知道存在哪些数据集。

关于r - 打包大数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26753518/

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