科学の箱

科学・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

factor

factorを利用することでベクトルやデータフレームで質的変数を取り扱うことができる。 ファクター化するフィールドに対してfactor()関数を適用すると、ファクター化されたベクトルが取得できる。 値 …

no image

ジニ係数(再掲)

ジニ係数について修正した。とりあえずコード。 revenue<-read.csv(file=”data.csv”, head=TRUE) revenue$TotalRevenues_n < …

no image

R Dataset – bone

データの説明 261人の子供たちから得られた年齢別骨密度。 フォーマット idnum: 識別コード age: 測定時の年齢 gender: 性別 spnbmd: 骨密度 チェック テーブル全体について …

no image

Rオブジェクト指向のメモ

whichではwhich.minとwhich.maxが用意されているという指摘を受けたので調べ見てた。 which.minとwhich.maxはRでいうところのオブジェクト指向を利用した構造にみえる。 …

no image

splineを利用する

データが連続していない時には、となりあうデータを使ってその間の値を予測できる。簡単な例では1と2という値があり、この間を一つの値で補完すると1.5となる。補間する値を増やしていけば滑らかな曲線になる。 …

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

side bar top



アーカイブ

カテゴリー