科学の箱

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

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

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

no image

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

5章で学ぶこと 5章では検定方法について紹介している。以下の方法について検定対象と検定する条件を理解する。 Z検定 t検定 無相関検定 独立性の検定 また検定の手順についてもまとめている。 検定方法 …

no image

findFn{sos}

findFn{sos} findFn(string, maxPages = 20, sortby = NULL, verbose = 1, …) 文字列から関数を探すことができる。パッケー …

no image

oneway.test, aov, anovaの違い

RではANOVAを実行する際にoneway.test, aov, anovaを利用できる。違いが判らない。調べてみるとなんかややこしそうなのでとりあえず資料だけ集めてみた。 ONEWAY BETWEE …

no image

conjoint分析の資料

マニュアル conjointパッケージ caFactorialDesign Rでconjointパッケージを利用した例 Rでコンジョイント分析 Rでコンジョイント分析 |極めて個人的なメモ コンジョイ …

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

side bar top



アーカイブ

カテゴリー