【问题标题】:R - Reading STDIN line by lineR - 逐行读取 STDIN
【发布时间】:2012-04-09 21:47:54
【问题描述】:

我想将大数据表逐行流式传输到 R 行,如果当前行具有特定条件(假设第一列 >15),则将该行添加到内存中的数据帧中。我写了以下代码:

count<-1;
Mydata<-NULL;
fin <- FALSE;
while (!fin){
    if (count==1){
        Myrow=read.delim(pipe('cat /dev/stdin'), header=F,sep="\t",nrows=1);
        Mydata<-rbind(Mydata,Myrow);
        count<-count+1;
    }
    else {
        count<-count+1;
        Myrow=read.delim(pipe('cat /dev/stdin'), header=F,sep="\t",nrows=1);
        if (Myrow!=""){
        if (MyCONDITION){
            Mydata<-rbind(Mydata,Myrow);
        }
        }
        else
        {fin<-TRUE}
    }
}
print(Mydata);

但我收到“数据不可用”错误。 请注意,我的数据很大,我不想一次读取所有数据并应用我的条件(在这种情况下很容易)。

【问题讨论】:

  • 您可能对此q的答案和cmets感兴趣:stackoverflow.com/questions/9352887/…
  • 请参阅?scan?readLinesnrows read.table 的参数,并注意您的解决方案在 R 中会非常慢 - 你可以使用Perl,甚至 awk,进行预处理?
  • 我的回答在速度方面如何?本质上,我打开一个文件并继续从中提取行而不关闭文件。
  • 请注意我要逐行读取数据。我的问题是如何告诉 R 数据正在流入并且应该逐行接收。这在 Perl 中也很容易,但我一直在寻找一种在 R 中实现的方法。

标签: r streaming line readline


【解决方案1】:

我认为使用像readLines 这样的 R 函数会更明智。 readLines 只支持读取指定的行数,例如1. 将其与先打开file 连接,然后反复调用readLines 相结合,即可获得您想要的。多次调用readLines 时,将从连接中读取下一个n 行。在 R 代码中:

stop = FALSE
f = file("/tmp/test.txt", "r")
while(!stop) {
  next_line = readLines(f, n = 1)
  ## Insert some if statement logic here
  if(length(next_line) == 0) {
    stop = TRUE
    close(f)
  }
}

其他 cmets:

  • R 有一种将标准输入视为文件的内部方法:stdin()。我建议你使用这个而不是使用pipe('cat /dev/stdin')。这可能使它更健壮,而且肯定更跨平台。
  • 您在开始时初始化Mydata 并使用rbind 继续增长它。如果您rbind 的行数变大,这会变得非常慢。这与这样一个事实有关,即当对象增长时,操作系统需要为它找到一个新的内存位置,这最终会花费 很多 时间。更好的是预先分配MyData,或者使用应用样式循环。

【讨论】:

  • 感谢您的回答。但我有一个问题:正如我所提到的,我的数据非常大,我不想将它读入内存。在代码的第 3 行中,您似乎正在读取整个数据,然后遍历其行。我说的对吗?
  • 不,我打开一个连接,然后从中读取。 next_line 仅包含当前行。使用file 只打开一个连接,它还没有读取任何内容。
  • 阿汉。谢谢。我应该写什么而不是 file() 的第一个参数“/tmp/test.txt”?
  • 我使用了你提到的代码 file("stdin","r");但是,当我在 Linux 中使用 cat ToyData.txt | 流式传输到该行时,我无法读取超过 1 行。 R --Vanilla --slave -f MyCode.R 有人知道为什么吗?
  • 而且我认为您不需要管道,只需使用file("ToyData.txt", "r")
猜你喜欢
  • 2012-08-11
  • 2011-06-25
  • 1970-01-01
  • 2014-01-15
  • 2016-06-05
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多