効率的にデータフレームの処理がしたい ( doBy vs plyr vs dplyr)
メジャーリーグのデータを弄って遊んでいます.
100Mbオーダーのデータフレームの処理をしています.
序論
今まではplyrのddplyで計算させていましたが, 遅いです.
doByパッケージで大体同じことができて, しかも速く計算出来ました.
どう使い分ければいいんでしょうね.
調べていたら, こんな記事がありました.
dplyr最強伝説 - 東京で尻を洗う
plyrの方が速い場合もあるみたいです.
しかも, dplyrを使えばもっと速くなるみたいです.
...
どう使い分ければいいのでしょうか...
とりあえず, doByとplyr, dplyrのどれが速いのか,
条件を変えながら実験してみます.
...
dplyrのインストールが出来ません. dplyrについてはあとで考えます.
今回は, doByとplyrの速度比較を少しだけ行います.
doByとplyrの速度比較 (列数を変えながら)
データフレームの列数が速度に影響している気がしています.
◯列以上のデータフレームならplyrが速い, みたいなことが分かると嬉しいです.
そこでこんな実験をしました.
dichikaさんのコードdplyr最強伝説 - 東京で尻を洗う
を参考にしながら,
4,000,000行のデータフレームを作成し,
列数を増やしながら, それぞれの処理の時間を計算しました.
コードはこんな感じです.
pylr vs doBy speed test
作成されたデータフレーム: dat は, こんな感じです.
> head(dat)[1:3] type value1 value2 1 E 0.57 0.37 2 E 0.54 0.20 3 B 0.73 0.48 4 E 0.30 0.74 5 D 0.27 0.63 6 C 0.94 0.78 > dim(dat) [1] 4000000 11 > print(object.size(dat), unit="MB") 320.4 Mb
各typeごとに, valueの平均を計算してみます.
列数は徐々に増えていきます.
plyrとdoByで, 計算時間はどのように変わるでしょうか.
結果.
列数を増やすとplyrは遅いです. doByはあまり変わりません.
まとめ
列数が大きなデータフレームを扱うときにはdoByのsummaryByを使うほうがいいみたいです.
メジャーリーグのデータは列数が大きい(97以上)ので, summaryByを使います.
あるいは, 処理したい列だけ抽出してからplyrで処理すると速く計算できますね.
dplyrも加えて実験したいですが, なんでインストールできないんでしょう...
(2014/1/5追記)
全部解決していただきました
dplyrは列数に影響を受けない - 東京で尻を洗う
dplyrを入れたい
追記 (2013/1/5)
plyr vs doBy speed test and visualize
dplyrが入ったPC(Ubuntu)がありました
dplyrも入れて実験しました.
コードはdichikaさんのものを勝手に使いました.
dplyrは列数に影響を受けない - 東京で尻を洗う
結果.
dplyr速い. すごいです.
... plyrも結構速いですよね... おかしい...