如何将文件中的选定列读入 R?(“read.table”和“scan”之间的折衷方案?)[重复]
-
25-09-2019 - |
题
这个问题在这里已经有答案了:
- 只读取选定的列 3 个回答
我有一些非常大的分隔数据文件 我只想处理 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.