> 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 のくわしい
論文
も掲載されてる.