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

Ale*_*ard 40 r delimited data-processing read.table

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

我所知道的唯一选择是read.table,当我只想要几列或者scan看起来我想要的水平太低时非常浪费.

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

Ken*_*ams 35

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

df <- read.table(pipe("cut -f1,5,28 myFile.txt"))
Run Code Online (Sandbox Code Playgroud)

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

只读列的数量有限,对于纯的R版本,使用"NULL"colClasses参数read.table.

  • 不,纯R等价物就像(假设28列)`mycols < - rep(NULL,28); mycols [c(1,5,28)] < - NA; df < - read.table(file,colClasses = mycols)` (12认同)
  • @DirkEddelbuettel我很偶然.确实看起来`NULL`需要在引号中. (2认同)

Dir*_*tel 19

一种可能性是使用pipe()代替文件名,并且具有awk或类似的过滤器仅提取所需的列.

了解help(connection)更多信息pipe和朋友.

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


JD *_*ong 8

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