サーチ…


前書き

Rでは、表形式のデータがデータフレームに格納されます 。このトピックでは、単一の表を変換するさまざまな方法について説明します。

備考

便利なパッケージ

リサーブ機能

データを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)


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow