有没有办法结合使用bigmemory包中的scan()和read.big.matrix()来读取带有混合类型列的200 MB .csv文件,以便结果是带整数的数据帧,字符和数字列?
答案 0 :(得分:9)
尝试使用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)
(对于更大的文件,可能需要您调查一些配置选项,具体取决于您的机器和操作系统。)
答案 1 :(得分:6)
由于矩阵必须是一种类型,尝试使用斯诺克bigmemory
来处理多种类型本身就是一件坏事。可以吗?我不会去那儿。为什么?因为其他一切都会假设它是一个矩阵,而不是数据帧。这将导致更多的问题和更多的悲伤。
现在,您可以做的是识别每个列的类型,并生成一组不同的bigmemory文件,每个文件包含特定类型的项目。例如。 charBM =字符大矩阵,intBM =整数大矩阵,依此类推。然后,您可以开发一个包装器,从而生成所有这些数据帧。我仍然不建议:将不同的项目视为它们是什么,或者如果可以的话,强迫同质性,而不是试图产生一个大的数据帧格里芬。
@mdsumner建议ff
是正确的。另一个存储选项是HDF5,您可以通过R中的ncdf4
访问它。不幸的是,这些其他包不如bigmemory
那么令人愉快。
答案 2 :(得分:3)
根据帮助文件,没有。
文件必须只包含一种原子类型(例如,所有整数)。 您(用户)应该知道您的文件是否包含行和/或列 名称和各种选项组合应该有所帮助 获得理想的行为。
我不熟悉这个包/函数,但在R中,矩阵只能有一种原子类型(与data.frames不同)。
答案 3 :(得分:0)
最好的解决方案是逐行读取文件并解析它,这样读取过程将占用几乎线性的内存量。