【问题标题】:Is there a built-in function for sampling a large delimited data set?是否有用于对大型分隔数据集进行采样的内置函数?
【发布时间】:2011-08-27 02:32:01
【问题描述】:

我有一些大型数据文件想在加载到 R 时进行采样。我可以加载整个数据集,但它确实太大而无法处理。 sample 做了大致正确的事情,但我想在阅读时对输入进行随机抽样。

我可以想象如何使用循环和 readline 来构建它,但肯定已经完成了数百次。

CRAN 甚至基地有什么东西可以做到这一点吗?

【问题讨论】:

  • 请参阅here 了解一些想法。

标签: r


【解决方案1】:

您可以使用 sqldf 在一行代码中做到这一点。请参阅sqldf home page 上的example 6 的第 6e 部分。

【讨论】:

  • sqldf 看起来不错,但不是我想要的。不过,我认为从长远来看这可能是正确的。
  • 是否应该将示例添加到答案中以使其基本上不是仅链接的答案?
【解决方案2】:

没有预制设施。最好的方法是使用数据库管理程序。 (好像上周在 SO 或 Rhelp 中解决了这个问题。)

看看:Read csv from specific row,特别注意格洛腾迪克的 cmets。我认为他是“A级向导”。他对 sqldf 有第一手经验。 (作者 IIRC。)

另一个成功的格洛腾迪克解决方案的“大文件”问题: R: how to rbind two huge data-frames without running out of memory

【讨论】:

    【解决方案3】:

    我编写了以下函数接近我想要的:

    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 或类似文件的连接中。

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2015-01-31
      • 2021-01-25
      • 2014-03-23
      相关资源
      最近更新 更多