裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

plyr なんて...(その1)

2015年11月11日 | ブログラミング

plyr がもてはやされるが,いかがなものか。

plyrパッケージ徹底入門」で紹介された用例について,検証してみよう。
http://www.slideshare.net/teramonagi/tokyo-r30-20130420

「データを分割し,分析し,結果を再結合して出力する」とはいうが,結果の出力書式は本来は意味のないものとは思う。
論文やレポートに収録するには,R のコンソール出力の丸々コピーでは済まないだろうから。

しかしまあ,一応できる限り同じ出力になるようにしてみよう。

そして,実際の処理時間を比較してみよう。

まずは,検証の環境についてまとめておこう。

> sessionInfo()
R version 3.2.2 (2015-08-14)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.1 (El Capitan)

> library(rbenchmark) # ver. 1.0.0
> library(plyr)       # ver. 1.8.3
> aq
> nrow(aq)
[1] 15300

まずは,ddply。

ある変数が取る値ごとに,別の変数の平均値を求めるという例題。

ベンチマーク・テストをするので,便宜的に引数のない関数とする。
> f1 = function() ddply(aq, "Month", summarize, AveTemp=mean(Temp))
> f2 = function() ddply(aq, .(Month), summarize, AveTemp=mean(Temp))
> f3 = function() {a=sapply(split(aq$Temp, aq$Month), mean);data.frame(Month=names(a), AveTemp=a, row.names=NULL)}

どれも,出力は同じになる
> f1()
  Month  AveTemp
1     5 65.54839
2     6 79.10000
3     7 83.90323
4     8 83.96774
5     9 76.90000
> f2()
  Month  AveTemp
1     5 65.54839
2     6 79.10000
3     7 83.90323
4     8 83.96774
5     9 76.90000
> f3()
  Month  AveTemp
1     5 65.54839
2     6 79.10000
3     7 83.90323
4     8 83.96774
5     9 76.90000

ベンチマーク・テスト
> benchmark(f1(), f2(), f3(), columns=c("test", "replications", "elapsed", "relative", "user.self", "sys.self"), replications=1000, order=NULL)
  test replications elapsed relative user.self sys.self
1 f1()         1000   3.998    3.483     3.704    0.346
2 f2()         1000   3.850    3.354     3.566    0.330
3 f3()         1000   1.148    1.000     1.075    0.087

考察

ddply のタイプ数はほぼ半分で済むが,処理時間は 3 倍以上かかる。

そうは言っても,1 回当たりの処理時間は 4 ミリ秒なんだから,速いの遅いの言っても意味がない。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 時系列データだって言っても... | トップ | plyr なんて...(その2) »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事