【发布时间】:2011-08-27 02:32:01
【问题描述】:
我有一些大型数据文件想在加载到 R 时进行采样。我可以加载整个数据集,但它确实太大而无法处理。 sample 做了大致正确的事情,但我想在阅读时对输入进行随机抽样。
我可以想象如何使用循环和 readline 来构建它,但肯定已经完成了数百次。
CRAN 甚至基地有什么东西可以做到这一点吗?
【问题讨论】:
-
请参阅here 了解一些想法。
标签: r
我有一些大型数据文件想在加载到 R 时进行采样。我可以加载整个数据集,但它确实太大而无法处理。 sample 做了大致正确的事情,但我想在阅读时对输入进行随机抽样。
我可以想象如何使用循环和 readline 来构建它,但肯定已经完成了数百次。
CRAN 甚至基地有什么东西可以做到这一点吗?
【问题讨论】:
标签: r
您可以使用 sqldf 在一行代码中做到这一点。请参阅sqldf home page 上的example 6 的第 6e 部分。
【讨论】:
没有预制设施。最好的方法是使用数据库管理程序。 (好像上周在 SO 或 Rhelp 中解决了这个问题。)
看看:Read csv from specific row,特别注意格洛腾迪克的 cmets。我认为他是“A级向导”。他对 sqldf 有第一手经验。 (作者 IIRC。)
另一个成功的格洛腾迪克解决方案的“大文件”问题: R: how to rbind two huge data-frames without running out of memory
【讨论】:
我编写了以下函数接近我想要的:
readBigBz2 <- function(fn, sample_size=1000) {
f <- bzfile(fn, "r")
rv <- c()
repeat {
lines <- readLines(f, sample_size)
if (length(lines) == 0) break
rv <- append(rv, sample(lines, 1))
}
close(f)
rv
}
我可能希望长期使用 sqldf,但这是对文件本身进行采样的一种非常有效的方法。我只是不太清楚如何将其包裹在 read.csv 或类似文件的连接中。
【讨论】: