熔化和转换 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 中查看更多信息