如何将文件中的选定列读入 R?(“read.table”和“scan”之间的折衷方案?)[重复]

StackOverflow https://stackoverflow.com/questions/2193742

这个问题在这里已经有答案了:

我有一些非常大的分隔数据文件 我只想处理 R 中的某些列 无需花费时间和内存来创建 data.frame 对于整个文件。

我知道的唯一选择是 read.table 当我只想要几列或 scan 这对于我想要的东西来说似乎太低了。

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

有帮助吗?

解决方案

有时,当我将数据存储在制表符分隔的文件中时,我会执行以下操作:

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

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

只读取有限数量的列 对于纯 R 版本,使用 "NULL" 在里面 colClasses 论证 read.table.

其他提示

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

help(connection) 了解更多 pipe 和朋友。

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

我认为德克的方法既直接又快速。我使用的另一种方法是将数据加载到 sqlite 中,它的加载速度比 read.table() 快得多,然后只提取您想要的内容。sqldf() 包使这一切变得非常简单。 这是一个链接 之前的堆栈溢出答案提供了 sqldf() 的代码示例。

这可能超出了您的需要,但是如果您正在运行 很大 数据集,那么你也可以看看 HadoopStreaming 包 它提供了一个map-reduce例程,使用 Hadoop.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top