Dav*_*vid 1 r reshape data.table
鉴于以下数据表描述了AT和BE国家汽车制造的生产投入:
DT <- data.table( Abb=c("AT", "AT", "BE", "BE"),input=c("iron", "glass", "iron", "glass"),AT_Car=c(5,5,0,5),BE_Car=c(0,3,2,2))
> DT
Abb input AT_Car BE_Car
1: AT iron 5 0
2: AT glass 5 3
3: BE iron 0 2
4: BE glass 5 2
Run Code Online (Sandbox Code Playgroud)
我使用了reshape函数来计算一些东西:
DT2 <- reshape(DT,direction='wide',idvar='Abb', timevar='input')
> DT2
Abb AT_Car.iron BE_Car.iron AT_Car.glass BE_Car.glass
1: AT 5 0 5 3
2: BE 0 2 5 2
Run Code Online (Sandbox Code Playgroud)
修改后,我需要将DT2转换回DT的原始格式.我怎样才能做到这一点?
先感谢您.
data.tablev1.9.5的开发版本具有datamelt和dcasttable.table方法的新功能.有关更多详细信息,请使用data.tables检查高效重塑,以及其他插图的入门Wiki.
Long-to-Wide - dcast接受多列:
require(data.table) # v1.9.5+
DT.c = dcast(DT, Abb ~ input, value.var = c('AT_Car', 'BE_Car'))
# Abb AT_Car_glass AT_Car_iron BE_Car_glass BE_Car_iron
# 1: AT 5 5 3 0
# 2: BE 5 0 2 2
Run Code Online (Sandbox Code Playgroud)
从长到长 - melt也接受以下列表measure.vars:
DT.m = melt(DT.c, id = "Abb", measure.vars = patterns("^AT_Car", "^BE_Car"),
variable.name = "input", value.name = c("AT_Car", "BE_Car"))
setattr(DT.m$input, 'levels', c("glass", "iron"))
# Abb input AT_Car BE_Car
# 1: AT glass 5 3
# 2: BE glass 5 2
# 3: AT iron 5 0
# 4: BE iron 0 2
Run Code Online (Sandbox Code Playgroud)