【发布时间】:2014-07-31 18:56:32
【问题描述】:
我正在使用 dcast.data.table 将长 data.table 转换为宽 data.table
library(data.table)
library(reshape2)
set.seed(1234)
dt.base <- data.table(A = rep(c(1:3),2), B = rep(c(1:2),3), C=c(1:4,1,2),thevalue=rnorm(6))
#from long to wide using dcast.data.table()
dt.cast <- dcast.data.table(dt.base, A ~ B + C, value.var = "thevalue", fun = sum)
#now some stuff happens e.g., please do not bother what happens between dcast and melt
setkey(dt.cast, A)
dt.cast[2, c(2,3,4):=1,with = FALSE]
现在我想将 data.table 再次融化回原来的列布局,在这里我被卡住了,如何将连接的 columnames 与强制转换的 data.table 分开,这是我的问题
dt.melt <- melt(dt.cast,id.vars = c("A"), value.name = "thevalue")
我需要两列而不是一列
我正在寻找的结果可以用这段代码产生
#update
dt.base[A==2 & B == 1 & C == 1, thevalue :=1]
dt.base[A==2 & B == 2 & C == 2, thevalue :=1]
#insert (2,1,3 was not there in the base data.table)
dt.newrow <- data.table(A=2, B=1, C=3, thevalue = 1)
dt.base <-rbindlist(list(dt.base, dt.newrow))
dt.base
一如既往地感谢任何帮助
【问题讨论】:
-
不清楚您希望最终结果是什么样子。您能否显示所需的输出。想必,你不能只拼接
dt.melt的variable列吗? -
@RicardoSaporta 我添加了一些额外的代码,以产生我正在寻找的结果。但与此同时,大卫有一个很好的解决方案,现在我只是在徘徊,如果这可以直接从 melt-function 中实现
标签: r data.table