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)