R Language
長い形式と広い形式の間でデータを再構成する
サーチ…
前書き
備考
リサーブ機能
データをreshape
ための最も柔軟な基底R関数は、 reshape
です。構文については?reshape
を参照してください。
# create unbalanced longitudinal (panel) data set
set.seed(1234)
df <- data.frame(identifier=rep(1:5, each=3),
location=rep(c("up", "down", "left", "up", "center"), each=3),
period=rep(1:3, 5), counts=sample(35, 15, replace=TRUE),
values=runif(15, 5, 10))[-c(4,8,11),]
df
identifier location period counts values
1 1 up 1 4 9.186478
2 1 up 2 22 6.431116
3 1 up 3 22 6.334104
5 2 down 2 31 6.161130
6 2 down 3 23 6.583062
7 3 left 1 1 6.513467
9 3 left 3 24 5.199980
10 4 up 1 18 6.093998
12 4 up 3 20 7.628488
13 5 center 1 10 9.573291
14 5 center 2 33 9.156725
15 5 center 3 11 5.228851
data.frameはアンバランスであることに注意してください。つまり、ユニット2は第1の期間に観測を欠いていますが、ユニット3と4には第2の期間に観測が欠落しています。また、ピリオドには2つの変数があります:カウントと値、および識別子と場所が変わらない2つの変数があります。
ロングトゥーワイド
data.frameをワイドフォーマットに変更するには、
# reshape wide on time variable
df.wide <- reshape(df, idvar="identifier", timevar="period",
v.names=c("values", "counts"), direction="wide")
df.wide
identifier location values.1 counts.1 values.2 counts.2 values.3 counts.3
1 1 up 9.186478 4 6.431116 22 6.334104 22
5 2 down NA NA 6.161130 31 6.583062 23
7 3 left 6.513467 1 NA NA 5.199980 24
10 4 up 6.093998 18 NA NA 7.628488 20
13 5 center 9.573291 10 9.156725 33 5.228851 11
欠落している期間は、NAsで埋められていることに注意してください。
幅広く再構成する場合、「v.names」引数は時間とともに変化する列を指定します。場所変数が必要でない場合は、 "drop"引数を使用して再形成する前に削除することができます。 data.frameからnon-varying / non-id列のみを削除する場合、v.names引数は不要になります。
reshape(df, idvar="identifier", timevar="period", direction="wide",
drop="location")
ワイドからロングまで
現在のdf.wideで長く変形するには、最小限の構文が必要です。
reshape(df.wide, direction="long")
しかし、これは典型的にはトリッキーです。
# remove "." separator in df.wide names for counts and values
names(df.wide)[grep("\\.", names(df.wide))] <-
gsub("\\.", "", names(df.wide)[grep("\\.", names(df.wide))])
これで単純な構文では、未定義の列についてエラーが発生します。
reshape
機能が自動的に解析reshape
が困難な列名では、変形するためにreshape
にワイド形式の特定の変数をグループ化reshape
ように指示reshape
"varying"引数を追加する必要があります。この引数は、変数名またはインデックスのベクトルのリストをとります。
reshape(df.wide, idvar="identifier",
varying=list(c(3,5,7), c(4,6,8)), direction="long")
long reshapingでは、 "v.names"引数を使用して結果の可変変数の名前を変更することができます。
ときどき "varying"の指定は、変数名のどの部分がvalue引数を指定し、time引数を指定reshape
かをreshape
に知らせる "sep"引数の使用によって避けることができます。
データの再構成
多くの場合、データはテーブルに格納されます。一般的に、この表データをワイドおよびロングフォーマットで分割することができます。ワイドフォーマットでは、各変数には独自の列があります。
人 | 高さ[cm] | 年齢[年] |
---|---|---|
アリソン | 178 | 20 |
ボブ | 174 | 45 |
カール | 182 | 31 |
ただし、すべての変数が1つの列にあり、値が2つ目の列にあるような長い形式の方が便利な場合があります。
人 | 変数 | 値 |
---|---|---|
アリソン | 高さ[cm] | 178 |
ボブ | 高さ[cm] | 174 |
カール | 高さ[cm] | 182 |
アリソン | 年齢[年] | 20 |
ボブ | 年齢[年] | 45 |
カール | 年齢[年] | 31 |
このプロセスを簡素化するために、Base Rと第三者パッケージを使用することができます。各オプションについて、 mtcars
データセットが使用されます。デフォルトでは、このデータセットは長い形式です。パッケージを動作させるために、行名を最初の列として挿入します。
mtcars # shows the dataset
data <- data.frame(observation=row.names(mtcars),mtcars)
ベースR
基底Rには、ワイドフォーマットとロングフォーマットの変換に使用できる2つの関数、 stack()
とunstack()
ます。
long <- stack(data)
long # this shows the long format
wide <- unstack(long)
wide # this shows the wide format
しかし、これらの機能は高度なユースケースでは非常に複雑になります。幸いにも、サードパーティのパッケージを使用する他のオプションがあります。
tidyrパッケージ
このパッケージはgather()
を使用してワイドからロングに変換し、 spread()
を使用してロングワイドからワイドに変換します。
library(tidyr)
long <- gather(data, variable, value, 2:12) # where variable is the name of the
# variable column, value indicates the name of the value column and 2:12 refers to
# the columns to be converted.
long # shows the long result
wide <- spread(long,variable,value)
wide # shows the wide result (~data)
data.tableパッケージ
data.tableパッケージはreshape2
関数を拡張し、関数melt()
を使用してワイドからロングに、 dcast()
長からワイドに移動します。
library(data.table)
long <- melt(data,'observation',2:12,'variable', 'value')
long # shows the long result
wide <- dcast(long, observation ~ variable)
wide # shows the wide result (~data)