stack()関数を用いて横長のデータを縦長にできることを教わった。このようなデータ形式の変換はよくあることなのでもう少し調べてみた。
scoreデータは以下のような形式となっている。
> head(score) 法学部 文学部 理学部 工学部 1 75 62 65 52 2 61 60 60 59 3 68 66 78 44 4 58 63 52 67 5 66 55 59 47 6 55 53 66 53
このデータをstack()関数にかけると以下のようになる。
> head(stack(score)) values ind 1 75 法学部 2 61 法学部 3 68 法学部 4 58 法学部 5 66 法学部 6 55 法学部
カラム名がind列に、その値がvaluesに入っていることがわかる。
stack()についてヘルプを見たところ、selectパラメータでstackする列を指定できるようだ。
以下のように+を指定すると指定された列のみstackする。
> stack(score, select=+法学部) values ind 1 75 法学部 2 61 法学部 3 68 法学部 4 58 法学部
以下のように-を指定すると指定された列以外のデータについてstackする。
> stack(score, select=-法学部) values ind 1 62 文学部 2 60 文学部 3 66 文学部
複数の列を指定する方法はよくわからなかった。
stack()と同じような機能を持つ関数でmeltがあることを思い出したので復習してみる。
> library(reshape) > score_m <- melt(score) Using as id variables > head(score_m) variable value 1 法学部 75 2 法学部 61 3 法学部 68 4 法学部 58 5 法学部 66 6 法学部 55
meltでは本来以下の形式でパラメータを指定する。
melt(score, id=c("id"))
idには残しておきたい列を指定するが、今回は残したい列はないので指定しない。この結果、カラム名にはvariableが入り、valueにそのカラムの値が設定された。
meltに対応した関数でcast()がある。meltは横長のデータを縦長にするのに対して、cast()では逆の操作を行う。
score_mに対してcast()をかけると集計されてしまう。
> cast(score_m) Aggregation requires fun.aggregate: length used as default value 法学部 文学部 理学部 工学部 1 (all) 8 8 8 8
cast()にはパラメータとして集計用の関数を指定できる。おそらくIDとなる列が指定されていないために一行にもまとめられてしまいその時にデフォルトの集計関数としてカウントが適用されるのではないかと推測される。
IDを追加して動作がどのように変わるかを確認してみる。IDの追加はtransform()を使う。
> score_m1 <- transform(score_m, ID=c(1:nrow(score_m))) > head(score_m1) variable value ID 1 法学部 75 1 2 法学部 61 2 3 法学部 68 3 4 法学部 58 4 5 法学部 66 5 6 法学部 55 6
cast()してみる。
> cast(score_m1, ID=c("ID"))
ID 法学部 文学部 理学部 工学部
1 1 75 NA NA NA
2 2 61 NA NA NA
3 3 68 NA NA NA
4 4 58 NA NA NA
5 5 66 NA NA NA
6 6 55 NA NA NA
7 7 65 NA NA NA
8 8 63 NA NA NA
9 9 NA 62 NA NA
10 10 NA 60 NA NA
11 11 NA 66 NA NA
12 12 NA 63 NA NA
13 13 NA 55 NA NA
もとのフォーマットとは異なってしまった。しかしデータのあるべきフォーマットとしてはこちらのほうが正しい気がする。
cast()とmelt()については下記が詳しい
reshape()を使って同じことをしてみた。
head(reshape(score, direction="long", varying=names(score)[1:4], v.names="value", times=names(score)[1:4])[1:2]) time value 1.法学部 法学部 75 2.法学部 法学部 61 3.法学部 法学部 68 4.法学部 法学部 58 5.法学部 法学部 66 6.法学部 法学部 55
データはstackされたのだが、indexとしてscoreのカラム名が出力された。いろいろパラメータを調整したがインデックスを取り除くことはできなかった。
reshape()についてはこちらを参照した。
R FAQ: How can I reshape my data in R?