我的问题是数据框DT首先用dcast()进行长转宽得到DT1,如何将DT1还原成DT?
我目前的想法是先宽转长,然后对列进行拆分进行还原。总感觉可以再简洁一点,但本人不知道如何优化,还望不吝赐教。
library(data.table)
DT<-data.table(
id=1:6,
sex=c('F','M','M','F','F','M'),
year=c(2010,2001,2002,2013,2010,2002),
grades=c(0.5,0.5,0.6,0.7,1,0.2)
)
DT
#> id sex year grades
#> 1: 1 F 2010 0.5
#> 2: 2 M 2001 0.5
#> 3: 3 M 2002 0.6
#> 4: 4 F 2013 0.7
#> 5: 5 F 2010 1.0
#> 6: 6 M 2002 0.2
#长转宽得到DT1
DT1<-dcast(DT,id~sex+year,value.var='grades')
DT1
#> id F_2010 F_2013 M_2001 M_2002
#> 1: 1 0.5 NA NA NA
#> 2: 2 NA NA 0.5 NA
#> 3: 3 NA NA NA 0.6
#> 4: 4 NA 0.7 NA NA
#> 5: 5 1.0 NA NA NA
#> 6: 6 NA NA NA 0.2
#先宽转长得到DT2
DT2<-melt(DT1,id.var='id',value.name='grades',na.rm=TRUE)
DT2
#> id variable grades
#> 1: 1 F_2010 0.5
#> 2: 5 F_2010 1.0
#> 3: 4 F_2013 0.7
#> 4: 2 M_2001 0.5
#> 5: 3 M_2002 0.6
#> 6: 6 M_2002 0.2
#对DT2进行列拆分,以此还原DT1,得到DT3
DT3<-DT2[,c('sex','year'):= tstrsplit(variable, "_", fixed = TRUE)][,variable:=NULL][]
DT3
#> id grades sex year
#> 1: 1 0.5 F 2010
#> 2: 5 1.0 F 2010
#> 3: 4 0.7 F 2013
#> 4: 2 0.5 M 2001
#> 5: 3 0.6 M 2002
#> 6: 6 0.2 M 2002
<sup>Created on 2020-07-20 by the reprex package (v0.3.0)</sup>