42

非常に大きな区切りデータファイルがいくつかあり、ファイル全体のを作成するための時間とメモリを使わずに、Rの特定の列のみを処理したいと考えています。data.frame

私が知っている唯一のオプションはread.table、2、3列だけが必要な場合に非常に無駄になるか、必要scanなものに対してレベルが低すぎるように見えるかです。

純粋なRを使用するか、他のシェルスクリプトを呼び出して列抽出を実行し、その出力でscanまたはread.tableを使用する、より良いオプションはありますか?(シェルスクリプトを呼び出して、その出力をRでキャプチャする方法についての質問につながるのはどれですか?)

4

4 に答える 4

35

タブ区切りファイルにデータがある場合、次のようなことを行うことがあります。

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

これによりcut、データの選択が可能になります。これは、メモリをまったく使用せずに実行できます。

の引数で使用する、純粋なRバージョンの限られた数の列のみを読み取るを参照してください。"NULL"colClassesread.table

于 2010-02-03T17:57:47.400 に答える
19

1つの可能性はpipe()、ファイル名の代わりに使用し、awkまたは同様のフィルターで必要な列のみを抽出することです。

と友達の詳細についてhelp(connection)は、を参照してください。pipe

編集read.table()colClassesについて非常に明確な場合は、これを行うこともできます。特定の列の値がNULLの場合、その列はすべてスキップされます。を参照してくださいhelp(read.table)。したがって、追加のパッケージやツールを使用せずに、ベースRにソリューションがあります。

于 2010-02-03T17:09:02.280 に答える
8

ダークのアプローチは簡単で速いと思います。私が使用した別の方法は、read.table()よりもはるかに高速にデータをsqliteにロードしてから、必要なものだけを引き出すことです。パッケージsqldf()を使用すると、これをすべて非常に簡単に行うことができます。これは、sqldf()のコード例を示す以前のスタックオーバーフローの回答へのリンクです。

于 2010-02-03T17:16:03.720 に答える
3

これはおそらく必要以上のものですが、非常に大きなデータセットを操作している場合は、 Hadoopを使用してmap-reduceルーチンを提供するHadoopStreamingパッケージも参照してください。

于 2010-02-03T17:16:20.527 に答える