r - 用 reshape2:::dcast 转置 data.table

标签 r data.table transpose reshape2

我正在转置一个 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”的方法来做到这一点?

最佳答案

在 data.table 中,您不需要 dcast 来完成您所追求的 reshape 。只需使用

 DT[, as.list(setNames(VOLUME, STORE))]

解释:

[.data.table , 如果 j表达式(即 DT[i, j] )是 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

因此在解决方案中:
  • setnNames (base R 函数。不要与 setnames 包中的 data.table 混淆)应用一个向量作为另一个向量的名称。
  • 将向量转换为 list告诉 [.data.table将它们视为列。

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

    广播问题

    至于reshape2::dcast的区别和 dcast.data.table ,正如@David Arenburg 在上面的评论中指出的那样,这已在 github 上的 data.table 的开发版本中得到解决,并将在 CRAN 上与 V1.9.6
    library (devtools)
    install_github("Rdatatable/data.table")
    

    关于r - 用 reshape2:::dcast 转置 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30305843/

    相关文章:

    r - 如何在R-studio的功能主体中设置断点?

    r - 在 R 中的 data.table 中分组,只保留列中的非 NA 值

    mysql - 如何获取 R Shiny 响应式(Reactive)下拉框中所选选项的值?

    r - 在错误顺序的 ggplot2 条形图图例元素中,一个玩家的条形颜色已关闭

    r - 寻找区间集之间的重叠/高效的重叠连接

    R-数据框一列中的值在其他列中出现了多少次? (最好不使用 for 循环)

    PYTHON:如何使用三角形数组将行转置为列?

    matlab - matlab中如何从文本文件中读取矩阵

    MYSQL - 选择4个随机行并将它们转置为插入语句的列

    r - 如何在 R 中将数字转换为小时和分钟?