データ変形のためのmeltとdcast関数

データ変形のためのmeltとdcast関数

data.tableパッケージは主にデータの変形操作に使用されます。その中でも主要な関数としてmeltdcastがあります。ここでmeltは主に広い形式から長い形式への変換に使用され、dcastは長い形式から広い形式への変換に使用されます。

meltdcastは元々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は変形対象の列を指定します。
  • 変形対象の列は自動的にvariablevalueという列名に変換されます。

コマンド内でvariablevalueの列名を変更することもできます。id.varsmeasure.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

タグ: data.table R データ変形 melt dcast

6月28日 17:50 投稿