data.table扩展reshape2的melt&dcast功能
(参考:使用data.tables进行有效的重塑)
library(data.table) ## generate some data dt <- data.table( name = rep(c("firstName", "secondName"), each=4), numbers = rep(1:4, 2), value = rnorm(8) ) dt # name numbers value # 1: firstName 1 -0.8551881 # 2: firstName 2 -1.0561946 # 3: firstName 3 0.2671833 # 4: firstName 4 1.0662379 # 5: secondName 1 -0.4771341 # 6: secondName 2 1.2830651 # 7: secondName 3 -0.6989682 # 8: secondName 4 -0.6592184
长到宽
dcast(data = dt, formula = name ~ numbers, value.var= "value") # name 1 2 3 4 # 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078 # 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814
在多列上(自data.table1.9.6开始)
## add an extra column dt[, value2 := value * 2] ## cast multiple value columns dcast(data = dt, formula = name ~ numbers, value.var= c("value", "value2")) # name value_1 value_2 value_3 value_4 value2_1 value2_2 value2_3 value2_4 # 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078 0.3672866 -1.6712572 3.190562 0.6590155 # 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814 -1.6409368 0.9748581 1.476649 1.1515627
宽到长
## use a wide data.table dt <- fread("name 1 2 3 4 firstName 0.1836433 -0.8356286 1.5952808 0.3295078 secondName -0.8204684 0.4874291 0.7383247 0.5757814", header = T) dt # name 1 2 3 4 # 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078 # 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814 ## melt to long, specifying the id column, and the name of the columns ## in the resulting long data.table melt(dt, id.vars= "name", variable.name= "numbers", value.name= "myValue") # name numbers myValue # 1: firstName 1 0.1836433 # 2: secondName 1 -0.8204684 # 3: firstName 2 -0.8356286 # 4: secondName 2 0.4874291 # 5: firstName 3 1.5952808 # 6: secondName 3 0.7383247 # 7: firstName 4 0.3295078 # 8: secondName 4 0.5757814