R言語でwide型~long型へのデータ変換のやり方

R/Rstudio

データ分析をする際,Excelとかgoogleスプシとかでまとめた横長のデータ(wide型)から縦長のデータ(long型)に変換することがちょくちょくあるので,忘れないように備忘録としてまとめます。

wide型のデータとは

wide型のデータとは,クロス集計表のように行と列が交わるセルにデータが入ったものです。
例えば,以下の表なものです。

生徒模試1回目模試2回目模試3回目
A202540
B303634
C404140

ぱっと見で見やすいのが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によるモダンな分析フローの世界―』技術評論社

タイトルとURLをコピーしました