23

我在 R 中有一个相当大的数据框,我想导出到 SPSS。这个文件让我头疼了好几个小时,试图首先将它导入 R,但是我成功使用read.fwf()了选项comment.char="%"(文件中没有出现的字符)和fill= TRUE(它是一个固定宽度的 ASCII 文件,缺少一些行所有变量,导致错误消息)。

无论如何,我的数据框目前由 3,9 个磨坊观察和 48 个变量(所有字符)组成。我可以通过将其拆分为 4 x 1 磨机 obs 集,df2 <- df[1:1000000,]然后是write.table(df2)等来相当快地将其写入文件,但是如果计算机没有锁定并且需要硬重置才能恢复,就无法一次扫描整个文件。

在听到关于 R 多年来不适合大型数据集的轶事之后,这是我第一次真正遇到此类问题。我想知道是否还有其他方法(将文件直接“转储”到磁盘的低级“转储”?)或者是否有一些我不知道的包可以有效地处理这种类型的大文件的导出?

4

5 回答 5

24

1)如果您的文件都是字符串,那么write.table()如果您首先将其更改为matrix.

2)也把它写成块,比如 1000000 行,但总是写到同一个文件中,并使用参数append = TRUE.

于 2012-03-15T06:58:23.050 回答
17

更新

经过 Matt Dowle 的大量工作并行化和添加其他效率改进,fread现在比write.csv. 有关更多信息,请参阅链接答案。


现在data.table有一个fwrite由 Otto Seiskari 贡献的函数,它的速度似乎是一般速度的两倍write.csv。有关一些基准,请参见此处

library(data.table) 
fwrite(DF, "output.csv")

请注意,行名被排除在外,因为该data.table类型不使用它们。

于 2016-04-08T04:42:46.713 回答
8

猜测一下,您的机器内存不足,因此 R 必须使用交换文件,这会减慢速度。如果您通过代码获得报酬,那么购买更多 RAM 可能比编写新代码更便宜。

也就是说,有一些可能性。您可以将文件导出到数据库,然后使用该数据库的工具写入文本文件。JD Long对这个问题的回答告诉你如何以这种方式读入文件;扭转这个过程应该不会太难。或者,bigmemoryandff包(如 Davy 提到的)可用于编写此类文件。

于 2012-03-14T14:57:11.453 回答
7

虽然我只用它来读取非常大的文件(10+ Gb),但我相信这个ff包具有编写非常大的 dfs 的功能。

于 2012-03-14T14:40:50.983 回答
7

好吧,对于非常大的文件和 R 通常的答案是,最好将此类工作卸载到数据库中。SPSS 具有 ODBC 连接性,并RODBC提供从 R 到 SQL 的接口。

我注意到,在检查我的信息的过程中,我被挖走了。

于 2012-03-14T15:01:06.227 回答