是否可以在没有变量列的情况下使用 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
我可以想象这在理论上是可行的,算法可能如下所示:
- 从顶部开始,从每个 id 中取出第一个值并将其放入新创建的列(自动选择名称)。
- 为每个 id 取第二个值 - 如果某个 id 没有,则输入
NA
.
- 以此类推,直到取完所有值。
我问是因为我只有 id
和 value
列的数据,并且想在不进行额外计算(即添加新列)的情况下执行此操作。
在我的例子中,dcast
非常快,而且我发现添加新列比执行 dcast
的计算成本更高 - 所以我想避免这种情况。虽然也许 dcast 如此之快是因为使用了这个 variable
列 :)
使用 dcast
,我们可以使用 paste
和 rowid
创建的表达式即时创建公式
library(data.table)
dcast(dt, id ~ paste0('var_', rowid(id)))
-输出
id var_1 var_2
1: 1 100 300
2: 2 200 NA
据我所知,在具有 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
我可以想象这在理论上是可行的,算法可能如下所示:
- 从顶部开始,从每个 id 中取出第一个值并将其放入新创建的列(自动选择名称)。
- 为每个 id 取第二个值 - 如果某个 id 没有,则输入
NA
. - 以此类推,直到取完所有值。
我问是因为我只有 id
和 value
列的数据,并且想在不进行额外计算(即添加新列)的情况下执行此操作。
在我的例子中,dcast
非常快,而且我发现添加新列比执行 dcast
的计算成本更高 - 所以我想避免这种情况。虽然也许 dcast 如此之快是因为使用了这个 variable
列 :)
使用 dcast
,我们可以使用 paste
和 rowid
library(data.table)
dcast(dt, id ~ paste0('var_', rowid(id)))
-输出
id var_1 var_2
1: 1 100 300
2: 2 200 NA