web-dev-qa-db-ja.com

ファイルから選択した列のみをRに読み込む方法は? ( `read.table`と` scan`の間の幸せな媒体?)

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

私が知っている唯一のオプションはread.tableこれは、列が2、3個しか必要ない場合や、低すぎると思われるscanの場合は非常に無駄です。

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

40
Alex Stoddard

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

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

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

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

35
Ken Williams

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

pipeおよび友人の詳細については、help(connection)を参照してください。

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

19

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

8
JD Long

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

3
Shane