熔化和转换 data.table
data.table 提供了广泛的可能性,可以高效,轻松地重塑你的数据
例如,在从长到宽重塑时,你可以同时将几个变量传递到 value.var 和 fun.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 设置为索引列,而 mean 和 sum 将针对每个 gear 和 cyl 组合计算 disp 和 hp。如果某些组合不存在,你可以指定其他参数,例如 na.rm = TRUE(将传递给 mean 和 sum 函数)或指定 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
这将通过 cyl 和 gear 将数据作为索引列,而以 d(disp&drat)开头的变量的所有值将出现在 value1 中,并且包含字母 e 的变量的值(qsec)和 gear)将出现在 value2 专栏中。
你还可以在指定 variable.name 和 value.name 参数时重命名结果中的所有列名称,或者在指定 variable.factor 和 value.factor 参数时决定是否要将 character 列自动转换为 factors。在 ?data.table::melt 中查看更多信息