【发布时间】:2015-05-18 14:25:41
【问题描述】:
我正在转置一个 data.table 并选择使用reshape2:::dcast,但是我对 data.table 的奇怪处理感到困扰......这是一个复制行为的玩具数据集:
> library(data.table)
> library(reshape2)
> DT <- structure(list(STORE = c(32123L, 32469L, 33177L, 33484L, 34772L, 34875L),
VOLUME = c(343.87205, 599.78335, 1665.90895, 712.0343, 465.6489, 622.5189)),
.Names = c("STORE", "VOLUME"),
sorted = "STORE",
class = c("data.table", "data.frame"),
row.names = c(NA, -6L))
> (R1 <- dcast(DT, . ~ STORE, value.var = "VOLUME"))
. 32123 32469 33177 33484 34772 34875
1 . 343.8721 599.7834 1665.909 712.0343 465.6489 622.5189
完美,正是我想要的样子(删除 . 列并不大)——但它不再被归类为 data.table:
> class(R1)
[1] "data.frame"
我试图在data.table包中显式调用data.tables的方法,但是R现在不喜欢这个公式:
> data.table:::dcast.data.table(DT, . ~ STORE, value.var = "VOLUME")
Error in data.table:::dcast.data.table(DT, . ~ STORE, value.var = "VOLUME") :
LHS of formula evaluates to 'character(0)', invalid formula.
2: stop("LHS of formula evaluates to 'character(0)', invalid formula.")
1: data.table:::dcast.data.table(DT, . ~ STORE, value.var = "VOLUME")
这可以通过创建一个在转置后删除的虚拟枢轴列来轻松解决:
> DT[, "dummy" := NA]
> (R2 <- data.table:::dcast.data.table(DT, dummy ~ STORE, value.var = "VOLUME"))
dummy 32123 32469 33177 33484 34772 34875
1: NA 343.8721 599.7834 1665.909 712.0343 465.6489 622.5189
> class(R2)
[1] "data.table" "data.frame"
但是,data.table:::dcast.data.table 没有处理转换公式的 NULL LHS 的事实让我相信我做错了——有没有“data.table”的方法来做到这一点?
【问题讨论】:
-
这很奇怪。 @Arun 可能想看看。作为一种快速解决方法,您可以致电
setDT(dcast(DT, . ~ ...)) -
另一种解决方法是删除第一个列而不创建虚拟枢轴列:
dcast.data.table(DT, .~STORE, value.var = "VOLUME")[,-1,with=FALSE] -
这适用于 GH 上的开发版本。或者你需要等待 1.9.6 版本在 cran 上发布。
标签: r data.table transpose reshape2