2017-02-16 7 views
0

私は、RStudioサーバーに9つのmioオブジェクトからなる大きなデータフレームを以下の形式で持っています(各installnrには多くの読み込みがあります)。そして、毎時のすべての読み取り値の平均と標準エラーバーを計算するスクリプトを実行すると、 Rがクラッシュします。巨大な計算時間を避け、メモリサイズを超える最善の方法は何ですか?大きなデータフレームを処理するときに計算時間を短縮する最も良い方法は何ですか?

 installnr readdate readings 
    1 002345 2014-08-17 {0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,2,0} 
    2 002345 2014-08-18 {0,0,0,0,0,0,4,1,0,0,0,0,1,1,1,1,0,1,1,1,1,1,0,1} 
    3 002345 2014-08-19 {0,1,2,1,0,1,1,1,2,0,1,0,1,0,1,0,1,0,1,0,2,1,1,0} 
    4 013459 2014-08-17 {1,0,0,1,0,1,1,1,1,0,1,0,1,0,1,0,0,1,3,1,0,0,1,1} 
    5 127465 2014-08-19 {0,1,0,0,1,0,1,1,1,0,0,1,2,0,1,0,0,1,1,0,0,1,1,1} 

私が実行しているスクリプトの例は以下の通りです:あなたはあなたの入力フォーマットに固執したい場合

df$readings = gsub("[{}]", "", as.character(df$readings)) 
Read1 = strsplit(df$readings, ",") 
Readings = matrix(as.numeric(unlist(Read1)), nrow=length(Read1)) 
colMeans(Readings) 
+2

'data.table'または' dplyr'を試してください – Rentrop

+0

作成している行列が大きすぎます。そのため、メモリ不足のためです。平均値に興味がある場合は、各行をループし、各列の合計を維持してください。最後にnrow(df)で割ります。 – thc

+0

私はread.csvを使って完全なデータフレームをインポートしています... – peny

答えて

0

、ここにあなたのために働くかもしれないソリューションです。

最初にstringrdata.tableをインストールして読み込みます。読み取りから

次に、抽出数とデータテーブルを作成する:正規表現[0-9]+が整数値をとること

dt <- data.table(str_extract_all(df$readings,"[0-9]+", simplify=TRUE)) 

注意。

第三に、CHRから数値にデータテーブル全体を変換:今すぐ

dt <- dt[, lapply(.SD, as.numeric)] 

、個々の列の平均値を計算するためにdt[, lapply(.SD, mean)]を使用しています。

もちろん、lapply(dt, mean)を使用することもできます。

+0

ありがとうございます。エラーメッセージに従って、ファイルやディレクトリが存在しないため、Rサーバにdata.tableをインストールすることはできません。あなたはなぜそれが分かりますか? – peny

+0

正確なエラーメッセージがわからないと言うのが難しい。それはまだない場合は、別の質問を開くことが最善だろう。 –

+0

残念ながら、Rがそのサイズのベクトル(19.5 Gb!)を割り当てることができないので、提案されたコードはどちらも動作しません。その他の提案はありますか? – peny

関連する問題