Yoshi Nishikawa Blog

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

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

  1. R: A self learn tutorial
    https://www.nceas.ucsb.edu/files/scicomp/Dloads/RProgramming/BestFirstRTutorial.pdf
  2. R-Tips 46.落ち穂ひろい
    http://cse.naro.affrc.go.jp/takezawa/r-tips/r/46.html
  3. R-Tips 24. apply() ファミリー
    http://cse.naro.affrc.go.jp/takezawa/r-tips/r/24.html