有没有一种方法可以结合使用 bigmemory 包中的 scan() 和 read.big.matrix() 来读取具有混合类型列的 200 MB .csv 文件,以便结果是具有整数、字符、和数字列?
4 回答
为此尝试 ff 包。
library(ff)
help(read.table.ffdf)
函数“read.table.ffdf”将分离的平面文件读入“ffdf”对象,非常类似于(并使用)“read.table”。它还可以与任何便利包装器一起使用,例如“read.csv”,并为 R 的常用包装器提供自己的便利包装器(例如“read.csv.ffdf”)。
对于 200Mb,它应该像这样简单的任务。
x <- read.csv.ffdf(file=csvfile)
(对于更大的文件,可能需要您调查一些配置选项,具体取决于您的机器和操作系统)。
啊,这辈子有些事情是不可能的,有些事情是被误解了,导致了不愉快的情况。@Roman 是对的:矩阵必须是一种原子类型。它不是数据框。
由于矩阵必须是一种类型,因此试图用斯诺克bigmemory
处理多种类型本身就是一件坏事。能做到吗?我不去那里。为什么?因为其他一切都会假设它得到一个矩阵,而不是一个数据框。这将导致更多的问题和更多的悲伤。
现在,您可以做的是识别每个列的类型,并生成一组不同的 bigmemory 文件,每个文件都包含特定类型的项目。例如 charBM = 字符大矩阵,intBM = 整数大矩阵,等等。然后,您可以开发一个包装器,从所有这些中生成一个数据框。我仍然不建议这样做:将不同的项目按原样对待,或者尽可能强制同质化,而不是尝试生成大数据框格里芬。
@mdsumner 的建议是正确的ff
。另一个存储选项是 HDF5,您可以ncdf4
在 R 中访问它。不幸的是,这些其他包不如bigmemory
.
根据帮助文件,没有。
文件必须只包含一种原子类型(例如,所有整数)。作为用户,您应该知道您的文件是否具有行和/或列名称,并且各种选项组合应该有助于获得所需的行为。
我不熟悉这个包/函数,但在 R 中,矩阵只能有一种原子类型(不像 data.frames)。
最好的解决方案是逐行读取文件并解析,这样读取过程将占用几乎线性的内存量。