Yoshi Nishikawa Blog

医学となにかのインタラクティブ

効率的なR運用を目指して

Rの基礎とプログラミング技法

Rの基礎とプログラミング技法に、Rを効率よく扱うコツについて非常にわかりやすく載っていたので、トライしてみた。

第5章:効率的なプログラミング

apply

  1. applyは、 ベクトル単位で処理できる
  2. lapplyはリストやデータフレームごと処理できる
  3. sapplyはlapplyの簡易版(返ってくるのはlistではなくベクトル)
  4. mapplyは多変量に適用できる
  5. 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