我有一个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
答案 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=';' )