熔化和轉換 data.table

data.table 提供了廣泛的可能性,可以高效,輕鬆地重塑你的資料

例如,在從長到寬重塑時,你可以同時將幾個變數傳遞到 value.varfun.aggregate 引數中

library(data.table) #v>=1.9.6
DT <- data.table(mtcars)

長到寬

dcast(DT, gear ~ cyl, value.var = c("disp", "hp"), fun = list(mean, sum))
   gear disp_mean_4 disp_mean_6 disp_mean_8 hp_mean_4 hp_mean_6 hp_mean_8 disp_sum_4 disp_sum_6 disp_sum_8 hp_sum_4 hp_sum_6 hp_sum_8
1:    3     120.100       241.5    357.6167        97     107.5  194.1667      120.1      483.0     4291.4       97      215     2330
2:    4     102.625       163.8         NaN        76     116.5       NaN      821.0      655.2        0.0      608      466        0
3:    5     107.700       145.0    326.0000       102     175.0  299.5000      215.4      145.0      652.0      204      175      599

這將把 gear 設定為索引列,而 meansum 將針對每個 gearcyl 組合計算 disphp。如果某些組合不存在,你可以指定其他引數,例如 na.rm = TRUE(將傳遞給 meansum 函式)或指定 builtin fill 引數。你還可以新增邊距,刪除缺失的組合以及資料的子集。在 ?data.table::dcast 中檢視更多資訊

從長到寬

在從寬到長重新整形時,你可以使用正規表示式將列傳遞給 measure.vars 引數

print(melt(DT, c("cyl", "gear"), measure = patterns("^d", "e")), n = 10)
    cyl gear variable value1 value2
 1:   6    4        1 160.00  16.46
 2:   6    4        1 160.00  17.02
 3:   4    4        1 108.00  18.61
 4:   6    3        1 258.00  19.44
 5:   8    3        1 360.00  17.02
---                                
60:   4    5        2   3.77   5.00
61:   8    5        2   4.22   5.00
62:   6    5        2   3.62   5.00
63:   8    5        2   3.54   5.00
64:   4    4        2   4.11   4.00

這將通過 cylgear 將資料作為索引列,而以 ddispdrat)開頭的變數的所有值將出現在 value1 中,並且包含字母 e 的變數的值(qsec)和 gear)將出現在 value2 專欄中。

你還可以在指定 variable.namevalue.name 引數時重新命名結果中的所有列名稱,或者在指定 variable.factorvalue.factor 引數時決定是否要將 character 列自動轉換為 factors。在 ?data.table::melt 中檢視更多資訊