代码之家  ›  专栏  ›  技术社区  ›  Alex Stoddard

如何只读选择文件中的列到R中?(介于“read.table”和“scan”之间的快乐媒介)[副本]

  •  39
  • Alex Stoddard  · 技术社区  · 15 年前

    这个问题已经有了答案:

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

    我知道的唯一选择是 read.table 当我只想要几根柱子或者 scan 这似乎太低的水平,我想要什么。

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

    4 回复  |  直到 7 年前
        1
  •  34
  •   Ken Williams Dirk is no longer here    7 年前

    有时,当数据位于以制表符分隔的文件中时,我会这样做:

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

    让我们 cut 做数据选择,这可以在不占用大量内存的情况下完成。

    Only read limited number of columns 对于纯R版本,使用 "NULL" colClasses 论证 read.table .

        2
  •  18
  •   Dirk is no longer here    15 年前

    一种可能是使用 pipe() 代替文件名 awk 或者类似的过滤器只提取所需的列。

    help(connection) 更多关于 pipe 还有朋友。

    编辑 : read.table() 如果您对colclasses非常明确,那么也可以这样做——给定列的值为空将跳过该列。见 help(read.table) . 因此,我们在基R中有一个解决方案,没有附加的包或工具。

        3
  •  8
  •   Community c0D3l0g1c    7 年前

    我认为德克的方法是直接和快速的。我使用的另一种方法是将数据加载到sqlite中,它的加载速度比read.table()快得多,然后只提取所需的数据。包sqldf()使这一切变得非常简单。 Here's a link 到上一个堆栈溢出答案,给出了sqldf()的代码示例。

        4
  •  3
  •   Shane    15 年前

    这可能比你需要的要多,但如果你正在操作 非常大 然后您还可以查看数据集 the HadoopStreaming package 它提供了一个地图减少程序使用 Hadoop .