2017-12-08 12 views
3

私は大規模(8GB)のデータセットを持っています。これは、既存のセットアップを使用してRに読み込むことはできません。データセットでfreadを使用しようとすると、すぐにRセッションがクラッシュし、基礎となるファイルからランダムな行を読み込もうとすると、以下の理由で不十分でした。(1)データセットの行の総数を知る良い方法がない。 (2)私の方法は真の「ランダムサンプリング」ではありませんでした。R:大規模なデータフレームの単純なランダムサンプル

失敗した行の数を取得するためにこれらの試み(彼らは限り単純にデータを読み取る:

  1. length(count.fields("file.dat", sep = "|"))
  2. read.csv.sql("file.dat", header = FALSE, sep = "|", sql = "select count(*) from file")

Rを経由して任意の方法はありますか大きな基礎をなすデータセットからランダムサンプルを生成する他のプログラム?

潜在的な考え方:最初の数行の「サンプル」を使用して、行ごとに含まれる平均情報量を知ることができます。そして、データセット(8GB)のサイズを与えなければならない行の数を戻しますか?これは正確ではありませんが、私はちょうどアンダーカットできるボールパークの数字を与えるかもしれません。

+2

SQLite dbに入れて、RSQLiteまたはdplyr経由でランダムな行セットを直接取得します。 – joran

+0

[reservoir sampling](https://en.wikipedia.org/wiki/Reservoir_sampling)のようなメソッドがありますが、共通のRパッケージの実装についてはわかりません。 – MrFlick

+1

最初の列を読み込み、行数を取得します( 'col.names')。 'fread'関数の' skip'と 'nrow'引数を使ってチャンクで読み込みます。これまでにそれをテストしていないかもしれませんが、おそらく非常に遅いですが動作する可能性があります。あなたがチャンクを得るたびに、そこからサンプルを取り出し、それを 'rm'してください。 – LyzandeR

答えて

3

freadの機能を使用して、入力としてファイルを前処理するシェルコマンドを受け入れる1つのオプションがあります。このオプションを使用して、gawkスクリプトを実行して必要な行を抽出することができます。 gawkがシステムにインストールされていない場合は、gawkをインストールする必要があります。代わりにawkがシステムにある場合は、その代わりに使用することができます。

まず上のテストするダミーファイルを作成することができます:

library(data.table) 
dt = data.table(1:1e6, sample(letters, 1e6, replace = TRUE)) 
write.csv(dt, 'test.csv', row.names = FALSE) 

今、私たちは、ファイル内にある行数を見つけるために、シェルコマンドwcを使用することができます。

nl = read.table(pipe("wc -l test.csv"))[[1]] 

は、サンプルを取ります(昇順で)一時ファイルに書き込むと、簡単にアクセスできるようになります。

N = 20 # number of lines to sample 
sample.lines = sort(sample(2:nl, N)) #start sample at line 2 to exclude header 
cat(paste0(sample.lines, collapse = '\n'), file = "lines.txt") 

は、今、私たちは(this answerに基づく)freadgawkを使用してサンプルに読むことができます。このリンクされた質問の中で他のgawkスクリプトのいくつかを試すこともできます。これは非常に大規模なデータでより効率的になる可能性があります。

dt.sample = fread("gawk 'NR == FNR {nums[$1]; next} FNR in nums' lines.txt test.csv") 
+0

ありがとうございますあなたの答え。 'nl = read.table(pipe(" wc -l test.csv "))[[1]]'私の疑問と同じ問題があると思われます。 Rコンソールを20分間稼働させましたが、回線はまだ終了していません。私は、行の球場の推定値でgawkのアイデアを試して、あなたに戻ってきます。 – Parseltongue

関連する問題