科学の箱

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

分散分析についてcase studyをしてみる。目的はRで分散分析を実行する際の手順を明確にすること、およびそれに付随するRの関数を理解することである。 目標として以下をあげておく テストデータを含め …

no image

一対比較法

一対比較法では複数の対象の順位を、個別の比較結果から明らかにすることができる。例えば今5種類の携帯電話があり、好ましさの順位を知りたいとする。一対比較法を利用しなければ、回答者は5について順番をつけて …

no image

Rで%>%を利用する。

rvestでスクレイピングをしようとしたら、%>%という記述が大量頻出。これ何かということで調べてみた。 https://stackoverflow.com/questions/24536154 …

no image

データフレームで層別に操作をする

Rでデータベースに似たデータを取り扱う際には、データフレームを使うことがおおい。JavaはPHPなどのプログラミング言語では、層別に集計作業をする際にはデータベース上のSQLか、データを読み込んでから …

no image

Rによるやさしい統計学/4-母集団と標本

言葉の定義 推測統計、推定、点推定、区間推定、検定 標本、標本統計量、推定量、標本抽出、確率変数、確率分布、標本誤差 標本分布、標本統計量、平均、標準偏差、標準誤差 4.5 標本分布 標本平均の標本分 …

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

side bar top



アーカイブ

カテゴリー