让我解释一下这个问题:
我知道函数 table
或 xtabs
计算列联表,但它们需要一个始终存储在 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/