分散分析をするときなど、factor
を使って分類が行われることがよくあるが、水準ごとに平均を求めたい場合がある。以下の例では、得点の平均を2つの課題それぞれに計算するためにtapply
を使用している。
task <- c(1, 1, 1, 1, 2, 2, 2, 2)
score <- c(2, 5, 9, 3, 6, 7, 8, 1)
tapply(score, task, mean)
## 1 2
## 4.75 5.50
ただ、mean
やvar
のような関数が用意されているときはよいが、もう少し複雑な関数を使いたいときもある。そのようなときには、function
で無名関数を作るとよい。たとえば以下は、無名関数を定義して平方和を求めている。
tapply(score, task, function(x) {sum(x*x)})
## 1 2
## 119 150
どうやらx
にはtask
の水準ごとに抽出されたscore
のベクトルがそれぞれ入ってくるようだ。つまり、はじめの呼び出しでは2,5,9,3
が、次の呼び出しでは6,7,8,1
が無名関数への引数x
に入ってくる。そこでx*x
で要素ごとの積を取り、その結果をsum
で合計する。
この文書はknitrで生成している。ファイルごとに手動で生成するのが面倒なので、以下のようなコードを使って、ファイル名の末尾がRmd
になっているファイルをリストアップし、それぞれをknit
してHTMLに変換している。また、途中で生成されるmarkdownファイルはあとで削除している。
library(knitr)
library(markdown)
files <- list.files(pattern="Rmd$")
for (filename in files) {
mdfile <- knit(input=filename)
markdownToHTML(file=mdfile, output=sub("Rmd", "html", filename), stylesheet="./style.css")
file.remove(mdfile)
}
ファイルが多くなってくると生成に時間がかかる。HTMLファイルとRmdファイルの更新日時を比較して、前回knit時から更新のないファイルについては生成をスキップするなど改良すればさらに良いだろう。