apply(), tapply()でグループデータに対応する
R の基本
University of California Santa BarbaraのサイトにR: A self learn tutorial が置いてあったので、これを活用しながら、基礎的な計算をRに「お願い」してみます。
Rはフリーソフトですが、慣れるという意味での時間的コストがかかります。本稿は、私が躓いたところを中心とした、Rによる計算の覚書です。
data("trees") #treesを呼び出す trees[1:5,] summary(trees) dim(trees) #行、列数がわかる
attach()
attach()を用いることで、trees$とうたなくても、直接Heightにアクセスできます。
trees$Height #通常は、データ名$行または列名(数) attach(trees) #attach()しておくと Height #直接アクセスできる。
apply functions
Rでは、forなどを用いてループを指示することができますが、煩雑になるため、出来るだけ避けたいところです。そこで有用なのがapply functionsです。
Rでは、apply(), mapply(), lapply(), sapply(), tapply() が準備されています。今回は、apply(), tapply(), mapply()を扱います。
apply()
applyでそれぞれの行や列などに計算を指示できます。
apply(trees, 1, mean) # mean of every row (dimension 1) apply(trees, 2, mean) # mean of every column (dimension 2) apply(trees, c(1,2), sqrt) # 各要素の平方根を求める sweep(trees, 2, apply(trees,2,mean)) # sweepを用い、各列から列平均を引く
tapply()
tapplyは容易にグループ分けしたもののグループごとの計算を指示することが出来るので、便利です。
臨床研究でも、治療薬群・プラセボ群や、暴露群・非暴露群などのグループごとの計算は一瞬でできてしまいます。
data(warpbreaks) # 織機当たりの破損の数のデータ attach(warpbreaks) # attach()する group <- factor(wool) # 要素をgroup化 levels(group) # group化を確認 tapply(breaks, group, mean) # breaks の平均をグループごとに計算
mapply()
最後にmapplyでは、以下の様なトリッキーことも可能です。
mapply(rep, 1:5, 5:1) # rep(1,5), rep(2,2), rep(5,1) を並べる mapply(rep, 5:1, 1:5) # rep(5,1), rep(2,2), rep(1,5) を並べる
sapply, lapplyはまた別の機会に触れたいと思います。
References
- R: A self learn tutorial
https://www.nceas.ucsb.edu/files/scicomp/Dloads/RProgramming/BestFirstRTutorial.pdf - R-Tips 46.落ち穂ひろい
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/46.html - R-Tips 24. apply() ファミリー
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/24.html