> head(d) # データの最初の部分をみてみる type n year1 year2 year3 1 B->A->B 31 B A B 2 A->C->B 28 A C B 3 A->A->C 28 A A C 4 B->A->C 27 B A C 5 C->E->C 26 C E C 6 E->E->D 26 E E D > dim(d) # data frame の大きさ [1] 500 5つまりいろいろな場所があって
year 1 -> 3
のあいだに,
B->A->B
と変化した場所は 31 箇所ありましたよ,
というデータがずらずらと 500 ばかりならんでるとしよう
A, B, ..., E
なる 5 type
がいくつあったかを R
で集計するのは簡単なんだけど,
> sapply(c("year1", "year2", "year3"), function(y) tapply(d$n, d[,y], sum)) year1 year2 year3 A 1824 1873 1474 B 1849 1723 1886 C 1598 1731 2032 D 1532 1595 1892 E 1883 1764 1402ただしこれはやや手ぬきな
sapply()
&
tapply()
よびだしなので,
たとえば year1
に A
が一個もない場合はこういうふうに table みたいな出力は得られない
(list
として出力される).
year
ごとに
A->B
といった変化がいくつあったか集計しなさい,
ただし
A->B
の個数がゼロだった場合もちゃんとゼロと出力せよ,
という場合には一行では書けない処理になってしまう.
ということで,
count.change()
なる関数を
count.R
内で定義してみた.
こんな動作になる.
> count.change(d, "n", c("year1", "year2", "year3")) type.T1 type.T2 type.T1T2 year1 year2 1 A A A->A 394 373 2 B A B->A 466 142 3 C A C->A 414 458 4 D A D->A 221 271 5 E A E->A 378 230 6 A B A->B 259 296 7 B B B->B 293 378 8 C B C->B 282 417 9 D B D->B 357 344 10 E B E->B 532 451 ... (以下略) ...まあ, ただ単に数えてるだけなんだけど …… われながらあまりわかりやすい R coding ではないような気がする.
sapply()
&
tapply()
がプログラム読者には想像しにくい複雑なデータ構造,
つまり label つき vector を生成する
(そしてその後の処理はその生成された label に依存する)
というあたりかな.
もしこれを他のプログラム言語で記述したならば,
おそらく
このあたりもっと長く冗長に (もしかしたら読みやすく) なってしまうわけで.
ssm()
関数),
つまり GLM 的な時系列解析ができるってコトですなぁ.
Journal of Statistical Software
にこの package のくわしい
論文
も掲載されてる.