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 ミリ秒なんだから,速いの遅いの言っても意味がない。
※コメント投稿者のブログIDはブログ作成者のみに通知されます