データ分析をする際,Excelとかgoogleスプシとかでまとめた横長のデータ(wide型)から縦長のデータ(long型)に変換することがちょくちょくあるので,忘れないように備忘録としてまとめます。
wide型のデータとは
wide型のデータとは,クロス集計表のように行と列が交わるセルにデータが入ったものです。
例えば,以下の表なものです。
生徒 | 模試1回目 | 模試2回目 | 模試3回目 |
---|---|---|---|
A | 20 | 25 | 40 |
B | 30 | 36 | 34 |
C | 40 | 41 | 40 |
ぱっと見で見やすいのがwide型の特徴です。
long型とは
long型のデータは1行につき1つの観測値が表されたものです。
wide型と同じデータを使うと以下のように表現されます。
生徒 | テスト | 点数 |
---|---|---|
A | 模試1回目 | 20 |
A | 模試2回目 | 25 |
A | 本試験 | 40 |
B | 模試1回目 | 30 |
B | 模試2回目 | 36 |
B | 本試験 | 34 |
C | 模試1回目 | 40 |
C | 模試2回目 | 41 |
C | 本試験 | 40 |
パッと見では,データの様子が分かりづらいのですが,
データ分析を行う上で扱いやすいのは,long型のデータとなります。
wide型からlong型へ変換する方法
ここからは,Rでwide型データからlong型データへ変換する方法をまとめます。
なお,データとしては,以下のスクリプトを入れることで,wide型のデータを作れます。
生徒<-c("A","B","C")
模試1回目<-c(20,30,40)
模試2回目<-c(25,36,41)
本試験<-c(40,35,40)
dat<-data.frame(生徒,模試1回目,模試2回目,本試験)
gather関数の使い方
Rでwide型からlong型へ変換する方法としては,gather関数を使うと良いです。
gather関数はtideyverseのパッケージ群に含まれるので,初回はインストールしましょう。
install.packages("tidyverse")
library("tidyverse")
gather関数に入れる引数は以下の通りです。
gather(データ,key,value,並び替える値のある列,並び替える値のある列2,……,並び替える値のある列n列目)
- key・・・wide型の列名が入る箇所の名前を入れる(独立変数の要因に入れるような名前にするとわかりやすい)
- value・・・wide型のときに各セルに入っていた値が入る列の名前を入れる(従属変数みたいな名前を入れるとわかりやすい)
- 並び替える値のある列1~列n列目 ・・・long型データとして並び替えたい列を指定する。列の数だけカンマで区切る
今回の例であれば,以下のようになります。
dat2<-gather(dat,key="テスト",value="点数",模試1回目,模試2回目,本試験)
「並び替える値のある列」は列名ではなく,列番号を入れることも可能です。
列が多すぎる場合は,列番号を範囲指定すると楽です(dat2_1)。
また,列番号の最期は,データの最終列であることがよくあるので,末尾をlength(dat)にすれば,列番号を数える必要なく楽にできます(dat2_2)。
dat2_1<-gather(dat,key="テスト",value="点数",2:4)
dat2_2<-gather(dat,key="テスト",value="点数",2:length(dat))
dat2_1もdat2_2もdat2と同じ結果になります。
long型からwide型へ変換する方法
ついでにRでlong型からwide型へ変換する方法も紹介します。
gather関数ではなく,spread関数を使います。
spread関数に入れる引数は以下の通りです。
spread(データ,key,value)
ここでは,keyとvalueの考え方が少しgatherと異なります
key・・・横長にする際に列名にしたい項目が入っている列を指定 value・・・新しく作られる各列に入れる値の指定
実際にdat2をspread関数を使ってdat1と同じ内容に戻してみます。
dat1_1<-spread(dat2,key=テスト,value="点数")
戻せました。
ただし,列の順番が自動的に決まってしまうので,順序を変えたい場合は,以下のように列順を変更すると良いと思います。
dat1_1r<-dat1_1[,1,3,4,2]
以上です。
参考書籍
R言語の勉強には以下の書籍がおすすめです。
松村優哉,湯谷啓明,紀ノ定保礼,前田和寛 著『RユーザのためのRStudio[実践]入門―tidyverseによるモダンな分析フローの世界―』技術評論社