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

Is R able to compute contingency tables on big file without putting the whole file in RAM?

让我解释一下这个问题:

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

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

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

我的问题,然后:我想知道在 R 中是否有包可以做到这一点。我知道可以像我一样逐行读取文件在 Python 中,但是在一个大文件上计算简单的统计数据(例如列联表)是一项非常基本的任务,我觉得应该有一些或多或少的 "integrated" 功能来在统计包中完成它。

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

您可以为此使用包 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

ff 包

#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 以获取有关内存操作的更多信息。