熔化和转换 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
列自动转换为 factor
s。在 ?data.table::melt
中查看更多信息