我有一些非常大的分隔数据文件,我只想处理 R 中的某些列,而不需要花费时间和内存来data.frame
为整个文件创建一个。
我知道的唯一选项read.table
是当我只想要几列时非常浪费,或者scan
对于我想要的来说似乎太低了。
有没有更好的选择,或者使用纯 R 或者调用其他一些 shell 脚本来进行列提取,然后在它的输出上使用 scan 或 read.table?(这导致了如何调用 shell 脚本并在 R 中捕获其输出的问题?)。
我有一些非常大的分隔数据文件,我只想处理 R 中的某些列,而不需要花费时间和内存来data.frame
为整个文件创建一个。
我知道的唯一选项read.table
是当我只想要几列时非常浪费,或者scan
对于我想要的来说似乎太低了。
有没有更好的选择,或者使用纯 R 或者调用其他一些 shell 脚本来进行列提取,然后在它的输出上使用 scan 或 read.table?(这导致了如何调用 shell 脚本并在 R 中捕获其输出的问题?)。
当我在制表符分隔的文件中有数据时,有时我会这样做:
df <- read.table(pipe("cut -f1,5,28 myFile.txt"))
这样就可以cut
进行数据选择,而无需使用太多内存。
请参阅仅读取纯 R 版本的有限列数"NULL"
,在colClasses
参数中使用read.table
.
One possibility is to use pipe()
in lieu of the filename and have awk
or similar filters extract only the columns you want.
See help(connection)
for more on pipe
and friends.
Edit: read.table()
can also do this for you if you are very explicit about colClasses -- a value of NULL for a given column skips the column alltogether. See help(read.table)
. So there we have a solution in base R without additional packages or tools.
我认为 Dirk 的方法既简单又快速。我使用的另一种方法是将数据加载到 sqlite 中,它的加载速度比 read.table() 快得多,然后只提取你想要的。sqldf() 包使这一切变得非常容易。这是一个指向先前堆栈溢出答案的链接,它提供了 sqldf() 的代码示例。
这可能超出了您的需要,但是如果您在非常大的数据集上进行操作,那么您可能还会查看HadoopStreaming 包,它提供了使用Hadoop的 map-reduce 例程。