読者です 読者をやめる 読者になる 読者になる

300億円欲しい

メジャーリーグのデータ解析します

効率的にデータフレームの処理がしたい ( 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で, 計算時間はどのように変わるでしょうか.

結果.
f:id:gg_hatano:20140105114921p:plain
列数を増やすと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は列数に影響を受けない - 東京で尻を洗う
結果.
f:id:gg_hatano:20140106114645p:plain
dplyr速い. すごいです.

... plyrも結構速いですよね... おかしい...