如何只读select从一个文件列到R? (`read.table`和`scan`之间的快乐媒介?)
我有一些非常大的分隔数据文件, 我只想处理R中的某些列,而不需要花费时间和内存为整个文件创build一个data.frame
。
我所知道的唯一select是read.table
,当我只想要几列或者scan
,这太浪费了。
有没有更好的select,无论是纯R或可能呼吁其他shell脚本进行列提取,然后使用扫描或read.table输出? (这导致了如何调用shell脚本并在R中捕获其输出的问题)。
有时我在制表符分隔的文件中有这样的数据:
df <- read.table(pipe("cut -f1,5,28 myFile.txt"))
这可以让cut
做数据select,它可以做,而不需要使用太多的内存。
[不正确的纯R版本删除] – 请参阅只读为正确的纯R版本的有限数量的列 ,使用colClasses
参数中的NULL read.table
。
一种可能是使用pipe()
代替文件名,并使用awk
或类似的filter只提取所需的列。
有关pipe
和朋友的更多信息,请参阅help(connection)
。
编辑 : read.table()
也可以为你做这个,如果你是非常明确的colClasses – 一个给定的列的NULL值跳过所有的列。 请参阅help(read.table)
。 所以我们有一个基地R的解决scheme,没有额外的软件包或工具。
我认为德克的做法是直接的,也是快速的。 我使用的替代方法是将数据加载到比read.table()加载速度快得多的sqlite中,然后只提取所需内容。 包sqldf()使这一切都很容易。 这里是一个链接到先前的堆栈溢出答案,给出了sqldf()的代码示例。
有一个包,colbycol,旨在做你正在寻找什么:
这可能比你需要的要多,但是如果你使用的是非常大的数据集,那么你也可以看看HadoopStreaming包 ,它提供了一个使用Hadoop的map-reduce例程。