R:从宽到长重塑
R: reshaping wide to long
我有一个看起来像这样的宽数据框:
ID Time Amount CabMean CabNum PartMean PartNum DinnMean DinNum Ex
1 1 1 27 0.654621546 8 NA 7 0.316791872 6 0
2 1 2 82 0.667461321 3 0.327594876 4 0.346798127 2 1
3 1 3 52 0.313976132 1 NA 6 0.197837257 7 0
4 1 4 99 0.798328712 9 0.913751678 4 0.191679538 9 1
我想将其重塑(使用 reshape2 包)为采用这种形式的长格式(只是将这些数字组合起来):
ID Time Amount Ex Type Mean Num
1 1 2 50 0 Cab 0.65654321 7
2 1 2 50 0 Part 0.65654321 1
3 1 2 50 0 Dinn 0.65654321 4
我试过这样的方法:
reshaped <- melt(data, id.vars = c("ID", "Time", "Amount", "Ex"))
这让我觉得像这样:
ID Time Amount Ex variable value
1 1 1 10 0 CabMean 0.6565432
2 1 2 12 0 CabMean 0.6565432
所以我只完成了大约一半,无法完全弄清楚其余部分。我如何(从我当前使用的代码,或从全新的代码)提取类型(Cab、Part、Dinn)作为单独的列,并创建 2 个额外的列来保存 Mean 和 Num 值?
我们可以使用 data.table
中的 melt
,它可以使用 pattern
参数获取多个 measure
列。我们将 'data.frame' 转换为 'data.table' (setDT(data)
),然后将 melt
转换为 'long' 格式。
library(data.table)
DT <- melt(setDT(data), measure=patterns('Mean$', 'Num$'),
variable.name='Type', value.name=c('Mean', 'Num'))
DT[, Type:=c('Cab', 'Part', 'Dinn')[Type]]
我有一个看起来像这样的宽数据框:
ID Time Amount CabMean CabNum PartMean PartNum DinnMean DinNum Ex
1 1 1 27 0.654621546 8 NA 7 0.316791872 6 0
2 1 2 82 0.667461321 3 0.327594876 4 0.346798127 2 1
3 1 3 52 0.313976132 1 NA 6 0.197837257 7 0
4 1 4 99 0.798328712 9 0.913751678 4 0.191679538 9 1
我想将其重塑(使用 reshape2 包)为采用这种形式的长格式(只是将这些数字组合起来):
ID Time Amount Ex Type Mean Num
1 1 2 50 0 Cab 0.65654321 7
2 1 2 50 0 Part 0.65654321 1
3 1 2 50 0 Dinn 0.65654321 4
我试过这样的方法:
reshaped <- melt(data, id.vars = c("ID", "Time", "Amount", "Ex"))
这让我觉得像这样:
ID Time Amount Ex variable value
1 1 1 10 0 CabMean 0.6565432
2 1 2 12 0 CabMean 0.6565432
所以我只完成了大约一半,无法完全弄清楚其余部分。我如何(从我当前使用的代码,或从全新的代码)提取类型(Cab、Part、Dinn)作为单独的列,并创建 2 个额外的列来保存 Mean 和 Num 值?
我们可以使用 data.table
中的 melt
,它可以使用 pattern
参数获取多个 measure
列。我们将 'data.frame' 转换为 'data.table' (setDT(data)
),然后将 melt
转换为 'long' 格式。
library(data.table)
DT <- melt(setDT(data), measure=patterns('Mean$', 'Num$'),
variable.name='Type', value.name=c('Mean', 'Num'))
DT[, Type:=c('Cab', 'Part', 'Dinn')[Type]]