←戻る

ちょっとしたこと

〜にあてはまる部分だけ抽出して計算

分散分析をするときなど、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

ただ、meanvarのような関数が用意されているときはよいが、もう少し複雑な関数を使いたいときもある。そのようなときには、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でまとめて文書生成

この文書は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時から更新のないファイルについては生成をスキップするなど改良すればさらに良いだろう。



[←戻る](index.html)