科学の箱

科学・IT・登山の話題

R

データの縦・横展開

投稿日:

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?

メタ情報

inarticle



メタ情報

inarticle



-R

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

分散分析のcase study-2

分散分析のcase study-1からの続き。 さて前回まででとりあえずデータの簡単な分析を終えて、以下のような結論を得た。 図1よりR1とR2を比較するとスピードはR1のほうが常に上である。またS1 …

no image

Rで型が不明なときの対処方法

データセットならstrを使う > str(iris) ‘data.frame’:   150 obs. of  5 variables:  $ Sepal.Length: num  5.1 4. …

no image

条件付きでレコードを取得する

データフレームでは条件付きでレコードを取得できる。 以下のようなフォーマットのデータフレームを考える id name height vector1 <- c(1, 2, 3, 4, 5) vec …

no image

サンプルサイズによる有意の違い

こちらでサンプル数について指摘をいただいたのでサンプル数によりp値がどのように変わるかをみてみる。  1996 2012 15~19歳 9 9 20~24歳 12 17 25~29歳 10 18 30 …

no image

Rによるやさしい統計学/5-統計的検定-2

練習問題-2 勉強時間と定期試験の点数についてデータを作成する。 study_time <- c(1, 3, 10, 12, 6, 3, 8, 4, 1, 5) point <- c(20 …

2014年5月
« 4月   6月 »
 1234
567891011
12131415161718
19202122232425
262728293031  

side bar top



アーカイブ

カテゴリー