2012-03-26 8 views
11

大きなデータテーブルをR LINE BY LINEにストリーミングしたい場合、現在の行に特定の条件がある場合(最初の列が> 15であるとします)、その行をデータに追加しますメモリ内のフレーム。私は次のコードを書いた:R - 行ごとにSTDINを読む

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); 

しかし、私はエラー "データが利用できません"が表示されます。 私のデータは大きく、一度にすべてを読んで自分の条件を適用したくないということに注意してください(この場合は簡単でした)。

+0

あなたは、このQの回答やコメントに興味がある可能性があり:http://stackoverflow.com/questions/9352887/strategies-for-reading-in-csv-files-in-pieces –

+0

は '見スキャン? '、'?readLines'、 'nrows'引数に' read.table'を追加して、あなたの解決策が** Rで非常に遅くなることに気をつけてください。Perlやawkを前処理することはできますか? –

+1

私の答えはスピードの点でどのように運賃ですか?本質的に私はファイルを開き、ファイルを閉じることなくファイルから行を引き出します。 –

答えて

11

readLinesのようなR関数を使うのが賢明だと思います。 readLinesは、指定された数の行の読み取りのみをサポートします。 1.それを最初にfile接続を開くと組み合わせて、readLinesを呼び出すと、繰り返しあなたが望むものが得られます。 readLinesを複数回呼び出すと、次のn行が接続から読み取られます。

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) 
    } 
} 

追加コメント:Rコードでstdin()

  • Rはファイルとして標準入力を処理する内部方法があります。 pipe('cat /dev/stdin')の代わりにこれを使用することをお勧めします。これにより、より堅牢になり、確かにクロスプラットフォームが増えます。
  • 最初にMydataを初期化し、rbindを使用して成長を続けます。 rbindの行数が大きくなると、これは非常に遅くなります。これは、オブジェクトが大きくなるとOSが新しいメモリ位置を見つける必要があり、その結果、が多くてになるという事実と関係しています。 MyDataを事前に割り当てるか、スタイル・ループを適用する方が良いでしょう。
+0

答えをありがとう。しかし、私はそれについての質問があります:私が言及したように、私のデータは非常に大きく、私はそれをメモリに読み込みたくありません。あなたのコードの3行目では、データ全体を読んでから、その行を見ているようです。私は正しい? – user1250144

+0

いいえ、私は接続を開いて、それから読む。 'next_line'は現在の行だけを含んでいます。 'file'を使うと接続が開かれますが、まだ何も読み込まれません。 –

+0

アハン。ありがとう。 file()の最初の引数 "/tmp/test.txt"の代わりに何を書き込むべきですか? – user1250144

関連する問題