如何只读取文件中的选择列到R? (`read.table`和`scan`之间的一个愉快的媒介?)

时间:2010-02-03 17:02:54

标签: r data-processing read.table delimited

我有一些非常大的分隔数据文件和我只想处理R 中的某些列,而不花时间和内存为整个文件创建data.frame

我所知道的唯一选项是read.table,当我只想要一些列或scan时,它们非常浪费,这似乎对我想要的内容来说太低了。

有没有更好的选择,无论是使用纯R还是调用其他shell脚本来进行列提取,然后在其输出上使用scan或read.table? (这导致了如何调用shell脚本并在R中捕获其输出的问题。)。

4 个答案:

答案 0 :(得分:34)

当我将数据放在制表符分隔的文件中时,有时我会这样做:

df <- read.table(pipe("cut -f1,5,28 myFile.txt"))

这使得cut可以进行数据选择,它可以在不使用大量内存的情况下完成。

使用"NULL"参数colClasses中的read.table,查看Only read limited number of columns的纯R版本。

答案 1 :(得分:18)

一种可能性是使用pipe()代替文件名,让awk或类似的过滤器只提取您想要的列。

有关help(connection)和朋友的更多信息,请参阅pipe

编辑:如果您对colClasses非常明确,read.table()也可以为您执行此操作 - 给定列的NULL值会全部跳过该列。见help(read.table)。因此,我们在基础R中有一个解决方案,没有额外的包或工具。

答案 2 :(得分:8)

我认为Dirk的方法既直接又快速。我使用的另一种方法是将数据加载到sqlite中,它比read.table()加载MUCH更快,然后只拉出你想要的。包sqldf()使这一切变得非常简单。 Here's a link到先前的堆栈溢出答案,它给出了sqldf()的代码示例。

答案 3 :(得分:3)

这可能超出了您的需要,但是如果您在非常大的数据集上运行,那么您可能还需要查看the HadoopStreaming package,它提供了map-reduce例程Hadoop