使用reshape2 ::: dcast转置data.table

mle*_*gge 6 transpose r reshape2 data.table

我正在转换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
Run Code Online (Sandbox Code Playgroud)

完美,正是我希望它看起来像(删除.列不是大) - 但它不再被归类为data.table:

> class(R1)
[1] "data.frame"
Run Code Online (Sandbox Code Playgroud)

我试图在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")
Run Code Online (Sandbox Code Playgroud)

通过在转置后创建要删除的虚拟枢轴列,可以轻松解决此问题:

> 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"
Run Code Online (Sandbox Code Playgroud)

然而,data.table:::dcast.data.table没有处理演员公式的NULL LHS 的事实让我相信我这样做是错的 - 是否有"data.table"方式来做到这一点?

Ric*_*rta 7

在data.table中,您不需要dcast来完成您所追求的重塑.简单地使用

 DT[, as.list(setNames(VOLUME, STORE))]
Run Code Online (Sandbox Code Playgroud)

说明:

[.data.table,如果j表达式(即DT[i, j])是a list,则列表被视为输出的列.
列表的名称作为列名称(缺少名称填写V*)

例如:

  DT[, j= list(ABC=123, greetings="Hello World", 1, alpha = 0.9995)]
  #    ABC   greetings V3  alpha
  # 1: 123 Hello World  1 0.9995
Run Code Online (Sandbox Code Playgroud)

因此在解决方案中:

  • setnNames(该base R功能.不要与混淆setnamesdata.table包)应用一个向量作为其他的名称.
  • 将向量转换为listtell [.data.table会将它们视为列.

(或者,您可以将其保留为命名向量,如果这是您的需要)


dcast问题

至于之间的差别reshape2::dcast,并dcast.data.table作为@大卫Arenburg在上述评论指出,这已经在data.table的开发人员版本解决在GitHub上,并将于CRAN与V1.9.6

library (devtools)
install_github("Rdatatable/data.table")
Run Code Online (Sandbox Code Playgroud)