6

我有一个包含 450 万行和 90 列的文本文件要导入到 R 中。使用时read.table我收到cannot allocate vector of size...错误消息,因此我尝试使用 ff 包导入,然后再对数据进行子集化以提取我感兴趣的观察结果(有关更多详细信息,请参阅我以前的问题:将选择条件添加到 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

4 回答 4

9

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

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

而不是隐式调用

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

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

于 2014-05-05T07:55:26.547 回答
4

您可以尝试以下代码:

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

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

对不起,我刚才遇到了这个问题。使用 VERBOSE 选项,您实际上可以看到读取每个数据块所花费的时间。希望这可以帮助。

于 2014-04-18T09:01:51.733 回答
1

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

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

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

这在 Linux 和 Mac 下运行良好,也许您需要安装 cygwin 以使其在 Windows 下运行或使用其他一些特定于 windows 的实用程序。

于 2014-01-31T21:07:51.633 回答
0

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

read.table.ffdf(x = NULL, file = 'your/file/path', seq=';' )
于 2015-02-11T14:45:27.947 回答