使用ff包导入文本文件

时间:2014-01-31 20:27:35

标签: r import ff large-data

我有一个450万行和90列的文本文件要导入到R.使用read.table我收到cannot allocate vector of size...错误消息,因此我尝试使用ff包导入,然后将数据子集化以提取我感兴趣的观察结果(有关详细信息,请参阅我之前的问题:Add selection crteria to read.table)。

所以,我使用以下代码导入:

test<-read.csv2.ffdf("FD_INDCVIZC_2010.txt", header=T)

但是会返回以下错误消息:

Error in read.table.ffdf(FUN = "read.csv2", ...) : 
only ffdf objects can be used for appending (and skipping the first.row chunk)

我做错了什么?

以下是文本文件的前5行:

    CANTVILLE.NUMMI.AEMMR.AGED.AGER20.AGEREV.AGEREVQ.ANAI.ANEMR.APAF.ARM.ASCEN.BAIN.BATI.CATIRIS.CATL.CATPC.CHAU.CHFL.CHOS.CLIM.CMBL.COUPLE.CS1.CUIS.DEPT.DEROU.DIPL.DNAI.EAU.EGOUL.ELEC.EMPL.ETUD.GARL.HLML.ILETUD.ILT.IMMI.INAI.INATC.INFAM.INPER.INPERF.IPO ...
1             1601;1;8;052;54;051;050;1956;03;1;ZZZZZ;2;Z;Z;Z;1;0;Z;4;Z;Z;6;1;1;Z;16;Z;03;16;Z;Z;Z;21;2;2;2;Z;1;2;1;1;1;4;4;4,02306147485403;ZZZZZZZZZ;1;1;1;4;M;22;32;AZ;AZ;00;04;2;2;0;1;2;4;1;00;Z;54;2;ZZ;1;32;2;10;2;11;111;11;11;1;2;ZZZZZZ;1;2;1;4;41;2;Z
2             1601;1;8;012;14;011;010;1996;03;3;ZZZZZ;2;Z;Z;Z;1;0;Z;4;Z;Z;6;2;8;Z;16;Z;ZZ;16;Z;Z;Z;ZZ;1;2;2;2;Z;2;1;1;1;4;4;4,02306147485403;ZZZZZZZZZ;3;3;3;1;M;11;11;ZZ;ZZ;00;04;2;2;0;1;2;4;1;14;Z;54;2;ZZ;1;32;Z;10;2;23;230;11;11;Z;Z;ZZZZZZ;1;2;1;4;41;2;Z
3             1601;1;8;006;05;005;005;2002;03;3;ZZZZZ;2;Z;Z;Z;1;0;Z;4;Z;Z;6;2;8;Z;16;Z;ZZ;16;Z;Z;Z;ZZ;1;2;2;2;Z;2;1;1;1;4;4;4,02306147485403;ZZZZZZZZZ;3;3;3;1;M;11;11;ZZ;ZZ;00;04;2;2;0;1;2;4;1;14;Z;54;2;ZZ;1;32;Z;10;2;23;230;11;11;Z;Z;ZZZZZZ;1;2;1;4;41;2;Z
4            1601;1;8;047;54;046;045;1961;03;2;ZZZZZ;2;Z;Z;Z;1;0;Z;4;Z;Z;6;1;6;Z;16;Z;14;974;Z;Z;Z;16;2;2;2;Z;2;2;4;1;1;4;4;4,02306147485403;ZZZZZZZZZ;2;2;2;1;M;22;32;MN;GU;14;04;2;2;0;1;2;4;1;14;Z;54;2;ZZ;2;32;1;10;2;11;111;11;11;1;4;ZZZZZZ;1;2;1;4;41;2;Z
5             1601;2;9;053;54;052;050;1958;02;1;ZZZZZ;2;Z;Z;Z;1;0;Z;2;Z;Z;2;1;2;Z;16;Z;12;87;Z;Z;Z;22;2;1;2;Z;1;2;3;1;1;2;2;4,21707670353782;ZZZZZZZZZ;1;1;1;2;M;21;40;GZ;GU;00;07;0;0;0;0;0;2;1;00;Z;54;2;ZZ;1;30;2;10;3;11;111;ZZ;ZZ;1;1;ZZZZZZ;2;2;1;4;42;1;Z

4 个答案:

答案 0 :(得分:6)

我遇到了与将csv读入ff对象相关的类似问题。使用

read.csv2.ffdf(file = "FD_INDCVIZC_2010.txt") 

而不是隐式调用

read.csv2.ffdf("FD_INDCVIZC_2010.txt")

我摆脱了错误。显式传递给参数的值似乎特定于ff函数。

答案 1 :(得分:3)

您可以尝试以下代码:

read.csv2.ffdf("FD_INDCVIZC_2010.txt", 
           sep = "\t",
           VERBOSE = TRUE,
           first.rows = 100000,
           next.rows = 200000,
           header=T)

我假设它是一个txt文件,它是一个制表符分隔的文件。

抱歉,刚才我遇到了这个问题。使用VERBOSE选项,您可以实际查看每个数据块读取的时间。希望这会有所帮助。

答案 2 :(得分:1)

如果可能的话,尝试过滤操作系统级别的数据,即在将它们加载到R之前。在R中执行此操作的最简单方法是使用pipe和grep命令的组合:

textpipe <- pipe('grep XXXX file.name |')
mutable <- read.table(textpipe)

您可以使用grep,awk,sed以及unix命令工具的基本上所有机制来添加必要的选择标准并在将它们导入R之前编辑csv文件。这非常快速,通过此过程可以删除不必要的R开始从管道读取它们之前的数据。

这在Linux和Mac下运行良好,也许您需要安装cygwin才能在Windows下工作或使用其他一些特定于Windows的工具。

答案 3 :(得分:0)

也许您可以尝试以下代码:

read.table.ffdf(x = NULL, file = 'your/file/path', seq=';' )