r - R 是否能够在不将整个文件放入 RAM 的情况下计算大文件的列联表?

标签 r file-io statistics contingency

让我解释一下这个问题:

我知道函数 tablextabs 计算列联表,但它们需要一个始终存储在 RAM 中的 data.frame。当尝试在大文件上执行此操作时(例如 20 GB,我必须处理的最大文件),这真的很痛苦。

另一方面,SAS 完全能够做到这一点,因为它逐行读取文件,并在此过程中更新结果。因此,RAM 中只有一行,这是更容易接受的。

有时,当我必须做更复杂的事情时,我会用临时 Python 程序做与 SAS 相同的事情,而这些事情要么我不知道如何在 SAS 中做,要么认为它太麻烦了。 Python 语法和集成功能(字典、正则表达式...)弥补了它的弱点(主要是速度,但读取 20 GB 时,速度无论如何都会受到硬盘驱动器的限制)。

我的问题:我想知道 R 中是否有包可以执行此操作。我知道可以像在 Python 中那样逐行读取文件,但是计算对大文件进行简单的统计(例如列联表)是一项基本任务,我觉得应该有一些或多或少的“集成”功能来在统计包中完成它。

请告诉我这个问题是否应该在“交叉验证”上提出。我有一个疑问,因为它更多的是关于软件而不是统计数据。

最佳答案

您可以使用包 ff 来实现此目的,它使用硬盘驱动器而不是 RAM,但它的实现方式不会使其(显着)慢于正常方式 R使用内存。

如果来自包描述:

The ff package provides data structures that are stored on disk but behave (almost) as if they were in RAM by transparently mapping only a section (pagesize) in main memory.

我认为这将解决您在 RAM 中加载 20GB 文件的问题。我自己也曾将其用于此类目的,效果非常好。

这里还有一个小例子。来自 xtabs 文档中的示例:

基础R

#example from ?xtabs
d.ergo <- data.frame(Type = paste0("T", rep(1:4, 9*4)),
                     Subj = gl(9, 4, 36*4))
> print(xtabs(~ Type + Subj, data = d.ergo)) # 4 replicates each
Subj
Type 1 2 3 4 5 6 7 8 9
  T1 4 4 4 4 4 4 4 4 4
  T2 4 4 4 4 4 4 4 4 4
  T3 4 4 4 4 4 4 4 4 4
  T4 4 4 4 4 4 4 4 4 4

优惠套餐

#convert to ff
d.ergoff <- as.ffdf(d.ergo)

> print(xtabs(~ Type + Subj, data = d.ergoff)) # 4 replicates each
    Subj
Type 1 2 3 4 5 6 7 8 9
  T1 4 4 4 4 4 4 4 4 4
  T2 4 4 4 4 4 4 4 4 4
  T3 4 4 4 4 4 4 4 4 4
  T4 4 4 4 4 4 4 4 4 4

您可以查看here有关内存操作的更多信息。

关于r - R 是否能够在不将整个文件放入 RAM 的情况下计算大文件的列联表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875791/

相关文章:

r - 函数对给定字符串长度的可变数量的子字符串进行采样

r - 如何通过关闭浏览器窗口来停止运行 Shiny 的应用程序?

r - 如何在R中对具有不同大小向量的时间序列数据进行聚类

python - 如何将 stdout 和 stderr 重定向到管道但保持有序

c++ - 读取带分隔符的文件

R:为组和非组的组合创建一阶差分

matlab - 如何以给定格式将数据保存到文本文件?

elasticsearch - 是否可以在父聚合定义的字段上执行Elasticsearch嵌套统计聚合?

statistics - 检测以特定频率生成的数据模式

ruby-on-rails - 是否有用于页面统计的 Rails Gem?