R Language
data.tableでピボット/アンピボット
サーチ…
構文
- 融解
melt(DT, id.vars=c(..), variable.name="CategoryLabel", value.name="Value")
-
dcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
キャストdcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
パラメーター
パラメータ | 詳細 |
---|---|
id.vars | 保持する列をmelt |
variable.name | 教えてmelt カテゴリラベルと列を呼び出すためにどのような |
value.name | カテゴリラベルに関連付けられた値を持つ列を何に呼び出すかをmelt 伝える |
value.var | 列にキャストする値の場所をdcast に通知します |
式 | 一意のレコード識別子(LHS)を形成するためにどの列を保持するか、カテゴリラベル(RHS)を保持する列をdcast する |
楽しい | キャスト演算が各セルの値のリストを生成するときに使用する関数を指定する |
備考
モデルやビジュアライゼーションを構築するためのデータの調整には、 data.table
することができます。他のオプションと比較して、 data.table
は速度と柔軟性の利点を提供します。
data.tableで表形式のデータをピボット/アンピボットする - I
ワイドフォームからロングフォームへの変換
data USArrests
datasets
からdata USArrests
をロードしdata USArrests
。
data("USArrests")
head(USArrests)
Murder Assault UrbanPop Rape
Alabama 13.2 236 58 21.2
Alaska 10.0 263 48 44.5
Arizona 8.1 294 80 31.0
Arkansas 8.8 190 50 19.5
California 9.0 276 91 40.6
Colorado 7.9 204 78 38.7
?USArrests
、 ?USArrests
を?USArrests
してください。まず、 data.table
に変換しdata.table
。状態の名前は元のdata.frame
行名data.frame
。
library(data.table)
DT <- as.data.table(USArrests, keep.rownames=TRUE)
これは広い形式のデータです。各変数の列があります。データは情報を失うことなく長い形式で保存することもできます。長いフォームには、変数名を格納する1つの列があります。次に、変数値の別の列があります。長い形のUSArrests
はそうそうです。
State Crime Rate
1: Alabama Murder 13.2
2: Alaska Murder 10.0
3: Arizona Murder 8.1
4: Arkansas Murder 8.8
5: California Murder 9.0
---
196: Virginia Rape 20.7
197: Washington Rape 26.2
198: West Virginia Rape 9.3
199: Wisconsin Rape 10.8
200: Wyoming Rape 15.6
私たちは、幅広いフォームから長いフォームに切り替えるためにmelt
機能を使用します。
DTm <- melt(DT)
names(DTm) <- c("State", "Crime", "Rate")
デフォルトでは、 melt
は数値データを持つすべての列を値を持つ変数として扱います。 USArrests
では、変数UrbanPop
は州の都市人口の割合を表します。それは、10万人あたりに報告されている暴力犯罪である他の変種、 Murder
、 Assault
、 Rape
とは異なります。 UrbanPop
列を保持したいとします。 id.vars
を次のように設定して、これを実現します。
DTmu <- melt(DT, id.vars=c("rn", "UrbanPop" ),
variable.name='Crime', value.name = "Rate")
names(DTmu)[1] <- "State"
カテゴリ名(Murder、Assaultなど)を含む列の名前をvariable.name
で指定し、値を含む列をvalue.name
指定していることに注意してください。私たちのデータはそうそうです。
State UrbanPop Crime Rate
1: Alabama 58 Murder 13.2
2: Alaska 48 Murder 10.0
3: Arizona 80 Murder 8.1
4: Arkansas 50 Murder 8.8
5: California 91 Murder 9.0
split-apply-combineスタイルのアプローチで要約を生成するのは簡単です。例えば、暴力犯罪を州ごとに要約するとします。
DTmu[, .(ViolentCrime = sum(Rate)), by=State]
これは与える:
State ViolentCrime
1: Alabama 270.4
2: Alaska 317.5
3: Arizona 333.1
4: Arkansas 218.3
5: California 325.6
6: Colorado 250.6
data.tableを使用した表形式データのピボットとアンピボット - II
ロングフォームからワイドフォームへの変換
前の例からデータを回復するには、 dcast
同様に使用します。
DTc <- dcast(DTmu, State + UrbanPop ~ Crime)
これにより、元のワイドフォームのデータが得られます。
State UrbanPop Murder Assault Rape
1: Alabama 58 13.2 236 21.2
2: Alaska 48 10.0 263 44.5
3: Arizona 80 8.1 294 31.0
4: Arkansas 50 8.8 190 19.5
5: California 91 9.0 276 40.6
ここでは、式記法を使用して、一意のレコード識別子(LHS)を構成する列と、新しい列名(RHS)のカテゴリラベルを含む列を指定します。どの列を数値に使用しますか?デフォルトでは、 dcast
は最初の列を使用して、数式の指定時に残った数値を使用します。明示的にするには、パラメータvalue.var
を列名と共に使用します。
操作によって各セルに値のリストが生成されると、 dcast
はfun.aggregate
メソッドを使用して状況を処理します。犯罪率を調査する際に、私は都市部の人口が類似している州に興味があるとします。私は計算された情報を持つ列Decile
を追加します。
DTmu[, Decile := cut(UrbanPop, quantile(UrbanPop, probs = seq(0, 1, by=0.1)))]
levels(DTmu$Decile) <- paste0(1:10, "D")
今、 Decile ~ Crime
をキャスティングすると、セルごとに複数の値が生成されます。 fun.aggregate
を使って、これらの処理方法を判断できます。テキストと数値の両方をこのように扱うことができます。
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
これは与える:
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=mean)
これは与える:
State UrbanPop Crime Rate Decile
1: Alabama 58 Murder 13.2 4D
2: Alaska 48 Murder 10.0 2D
3: Arizona 80 Murder 8.1 8D
4: Arkansas 50 Murder 8.8 2D
5: California 91 Murder 9.0 10D
都市人口の各10分の1には複数の州があります。 fun.aggregate
を使用して、これらの処理方法を指定します。
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
これは、同様の状態のデータを合計し、以下を与えます。
Decile Murder Assault Rape
1: 1D 39.4 808 62.6
2: 2D 35.3 815 94.3
3: 3D 22.6 451 67.7
4: 4D 54.9 898 106.0
5: 5D 42.4 758 107.6