是否可以在没有变量列的情况下使用 dcast?

Is it possible to use dcast without variable column?

据我所知,在具有 class data.table 的对象上使用 dcast 函数的标准方法是指定变量(将成为列名)和值(将成为这些列的值)。

我有一个包含三列的 data.table - id、变量和值:

library(data.table)

dt <- data.table(id = c(1, 2, 1),
                 variable = c("var_1", "var_1", "var_2"),
                 value = c(100, 200, 300))

dt

#>    id variable value
#> 1:  1    var_1   100
#> 2:  2    var_1   200
#> 3:  1    var_2   300

我想要 dcast:

提供的输出
dt_wide <- dcast(dt, id ~ variable, value.var = "value")

dt_wide
#>    id var_1 var_2
#> 1:  1   100   300
#> 2:  2   200    NA

但我的问题是 - 我可以在没有 specyfing 变量的情况下执行此操作吗? IE。我可以使用 dcast 并获得上面的输出,对象如下吗?

dt[, variable := NULL]

dt
#>    id value
#> 1:  1   100
#> 2:  2   200
#> 3:  1   300

# dcast(dt)? Result:

data.table(id = c(1, 2),
           V1 = c(100, 200),
           V2 = c(300, NA))
#>    id  V1  V2
#> 1:  1 100 300
#> 2:  2 200  NA

我可以想象这在理论上是可行的,算法可能如下所示:

  1. 从顶部开始,从每个 id 中取出第一个值并将其放入新创建的列(自动选择名称)。
  2. 为每个 id 取第二个值 - 如果某个 id 没有,则输入 NA.
  3. 以此类推,直到取完所有值。

我问是因为我只有 idvalue 列的数据,并且想在不进行额外计算(即添加新列)的情况下执行此操作。

在我的例子中,dcast 非常快,而且我发现添加新列比执行 dcast 的计算成本更高 - 所以我想避免这种情况。虽然也许 dcast 如此之快是因为使用了这个 variable 列 :)

使用 dcast,我们可以使用 pasterowid

创建的表达式即时创建公式
library(data.table)
dcast(dt, id ~ paste0('var_', rowid(id)))

-输出

   id var_1 var_2
1:  1   100   300
2:  2   200    NA