2

让我解释一下这个问题:

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

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

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

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

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

4

1 回答 1

2

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

如果来自包装描述:

ff 包提供了存储在磁盘上的数据结构,但通过仅透明地映射主内存中的一个部分(页面大小),其行为(几乎)就好像它们在 RAM 中一样。

我认为这将解决您在 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

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

于 2015-04-26T10:03:32.937 回答