データ変形のためのmeltとdcast関数
data.tableパッケージは主にデータの変形操作に使用されます。その中でも主要な関数としてmeltとdcastがあります。ここでmeltは主に広い形式から長い形式への変換に使用され、dcastは長い形式から広い形式への変換に使用されます。
meltとdcastは元々reshape2パッケージに含まれていましたが、現在はdata.tableパッケージに拡張として含まれています。バージョン1.9.6以降では、reshape2パッケージを明示的に読み込む必要なく、data.tableパッケージを読み込むだけでこれらの関数を使用できます。ただし、reshape2パッケージを使用する必要がある場合は、data.tableパッケージより前に読み込むようにしてください。
melt関数
以下のようなデータがあるとします:
library(data.table)
DT <- fread("family_data.csv")
head(DT)
## family_id mother_age child1_birth child2_birth child3_birth ## 1: 1 30 1998-11-26 2000-01-29 NA ## 2: 2 27 1996-06-22 NA NA ## 3: 3 26 2002-07-11 2004-04-05 2007-09-02 ## 4: 4 32 2004-10-10 2009-08-27 2012-07-21 ## 5: 5 29 2000-12-05 2005-02-28 NA
str(DT)
## Classes 'data.table' and 'data.frame': 5 obs. of 5 variables: ## $ family_id : int 1 2 3 4 5 ## $ mother_age : int 30 27 26 32 29 ## $ child1_birth : chr "1998-11-26" "1996-06-22" "2002-07-11" "2004-10-10" ... ## $ child2_birth : chr "2000-01-29" NA "2004-04-05" "2009-08-27" ... ## $ child3_birth : chr NA NA "2007-09-02" "2012-07-21" ... ## - attr(*, ".internal.selfref")=<externalptr>
DT.m1 <- melt(DT,
id.vars = c("family_id", "mother_age"),
measure.vars = c("child1_birth", "child2_birth", "child3_birth"))
DT.m1
## family_id mother_age variable value ## 1: 1 30 child1_birth 1998-11-26 ## 2: 2 27 child1_birth 1996-06-22 ## 3: 3 26 child1_birth 2002-07-11 ## 4: 4 32 child1_birth 2004-10-10 ## 5: 5 29 child1_birth 2000-12-05 ## 6: 1 30 child2_birth 2000-01-29 ## 7: 2 27 child2_birth NA ## 8: 3 26 child2_birth 2004-04-05 ## 9: 4 32 child2_birth 2009-08-27 ## 10: 5 29 child2_birth 2005-02-28 ## 11: 1 30 child3_birth NA ## 12: 2 27 child3_birth NA ## 13: 3 26 child3_birth 2007-09-02 ## 14: 4 32 child3_birth 2012-07-21 ## 15: 5 29 child3_birth NA
str(DT.m1)
## Classes 'data.table' and 'data.frame': 15 obs. of 4 variables: ## $ family_id : int 1 2 3 4 5 1 2 3 4 5 ... ## $ mother_age : int 30 27 26 32 29 30 27 26 32 29 ... ## $ variable : Factor w/ 3 levels "child1_birth","child2_birth",..: 1 1 1 1 1 2 2 2 2 2 ... ## $ value : chr "1998-11-26" "1996-06-22" "2002-07-11" "2004-10-10" ... ## - attr(*, ".internal.selfref")=<externalptr>
measure.varsは変形対象の列を指定します。- 変形対象の列は自動的に
variableとvalueという列名に変換されます。
コマンド内でvariableとvalueの列名を変更することもできます。id.varsとmeasure.varsが指定されていない場合、数値、整数、論理値でない列が自動的にid.varsとして扱われ、警告メッセージが出力されます。
DT.m1 <- melt(DT,
measure.vars = c("child1_birth", "child2_birth", "child3_birth"),
variable.name = "child_number",
value.name = "birth_date")
DT.m1
## family_id mother_age child_number birth_date ## 1: 1 30 child1_birth 1998-11-26 ## 2: 2 27 child1_birth 1996-06-22 ## 3: 3 26 child1_birth 2002-07-11 ## 4: 4 32 child1_birth 2004-10-10 ## 5: 5 29 child1_birth 2000-12-05 ## 6: 1 30 child2_birth 2000-01-29 ## 7: 2 27 child2_birth NA ## 8: 3 26 child2_birth 2004-04-05 ## 9: 4 32 child2_birth 2009-08-27 ## 10: 5 29 child2_birth 2005-02-28 ## 11: 1 30 child3_birth NA ## 12: 2 27 child3_birth NA ## 13: 3 26 child3_birth 2007-09-02 ## 14: 4 32 child3_birth 2012-07-21 ## 15: 5 29 child3_birth NA
dcast関数
dcastはデータを長い形式から広い形式に変換します。
dcast(DT.m1, family_id + mother_age ~ child_number, value.var = "birth_date")
## family_id mother_age child1_birth child2_birth child3_birth ## 1: 1 30 1998-11-26 2000-01-29 NA ## 2: 2 27 1996-06-22 NA NA ## 3: 3 26 2002-07-11 2004-04-05 2007-09-02 ## 4: 4 32 2004-10-10 2009-08-27 2012-07-21 ## 5: 5 29 2000-12-05 2005-02-28 NA
dcastは式インターフェースを使用します。value.varは広い形式に変換する列を指定します。
各家族の子供の数を知りたい場合はどうすればよいでしょうか?
dcast(DT.m1, family_id ~ .,
fun.aggregate = function(x) sum(!is.na(x)),
value.var = "birth_date")
## family_id V1 ## 1: 1 2 ## 2: 2 1 ## 3: 3 3 ## 4: 4 3 ## 5: 5 2
参考文献:Efficient reshaping using data.tables