効率的なR運用を目指して
Rの基礎とプログラミング技法
Rの基礎とプログラミング技法に、Rを効率よく扱うコツについて非常にわかりやすく載っていたので、トライしてみた。
第5章:効率的なプログラミング
apply
- applyは、 ベクトル単位で処理できる
- lapplyはリストやデータフレームごと処理できる
- sapplyはlapplyの簡易版(返ってくるのはlistではなくベクトル)
- mapplyは多変量に適用できる
- tapplyはクロス集計表を作成できる
#apply x<-matrix(c(1:9), nr=3) apply(x,1,mean) #第二の引数は次元、ここでは行。2だと列。 #lapply, sapply data(anscombe) attach(anscombe) ans.reg<-vector(4, mode="list") for(i in 1:4){ x<-get(paste("x", i, sep="")) y<-get(paste("y", i, sep="")) ans.reg[[i]] <- lm(y~x) } lapply(ans.reg, coef) #データフレーム、リスト、ベクトルなどの構造に、coef()関数を適用 sapply(ans.reg, coef) #sはsimplifyであり、返されるのはベクトル lapply(ans.reg, "[", 1) #このようにも[]を関数としても使える。 #mapply mapply(sum, 1:10, 2:11, 3) #多変量に同じ処理が出来るが、一つ目の引数が関数となる。 #tapply data(iris) attach(iris) tapply(Sepal.Width, Species, mean) data(iris) attach(iris) tapply(Sepal.Length, Species, range)
効率性を分析する
以下のようなツールが搭載されている。
proc.time() #Rを起動してからの経過時間を出力する system.time() #式の実行時間を出力する Rprof() #コレ以降の実行時間を分析開始 Rprof(NULL) #これまでで終了 summaryRprof() #summary表示 gc() #R実行中のメモリの消費状況を調べるには、gc()を使う。其の点で使われていないメモリ領域が解放される。
さらに詳しい分析は、proftools packageなどが使える。
バッチ処理(第9章:拡張)
一括処理とも呼ばれる。定期的に実行しなければならない処理や、エンジニア同士でシェアするような状況では、Rを立ち上げずとも、以下のようにOSのバックグラウンドで出来るようにすべきである。
例えば、xxxx.rというファイルをRで実行して、output.txtを出力するには、以下をターミナル(macでは)で実行すればよい。
R CMD BATCH xxxx.r output.txt