我想在data.table
中复制dplyr
的行为,以便通过group_by
和reframe
扩展行.我可以通过自己设置列名来完成,但如果我设置动态列名(即,基于外部向量).示例如下:
library(data.table)
library(dplyr)
iris <- as.data.table(iris)
# Dplyr
varname <- c("new_var")
var_levels <- c("level1", "level2")
iris %>%
group_by(pick(everything())) %>%
reframe({{varname}} := var_levels)
#> # A tibble: 298 × 6
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species new_var
#> <dbl> <dbl> <dbl> <dbl> <fct> <chr>
#> 1 4.3 3 1.1 0.1 setosa level1
#> 2 4.3 3 1.1 0.1 setosa level2
#> 3 4.4 2.9 1.4 0.2 setosa level1
#> 4 4.4 2.9 1.4 0.2 setosa level2
#> 5 4.4 3 1.3 0.2 setosa level1
#> 6 4.4 3 1.3 0.2 setosa level2
#> 7 4.4 3.2 1.3 0.2 setosa level1
#> 8 4.4 3.2 1.3 0.2 setosa level2
#> 9 4.5 2.3 1.3 0.3 setosa level1
#> 10 4.5 2.3 1.3 0.3 setosa level2
#> # ℹ 288 more rows
# Data.table:
iris[, .(new_var = var_levels) , keyby = names(iris)]
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species new_var
#> 1: 4.3 3.0 1.1 0.1 setosa level1
#> 2: 4.3 3.0 1.1 0.1 setosa level2
#> 3: 4.4 2.9 1.4 0.2 setosa level1
#> 4: 4.4 2.9 1.4 0.2 setosa level2
#> 5: 4.4 3.0 1.3 0.2 setosa level1
#> ---
#> 294: 7.7 3.0 6.1 2.3 virginica level2
#> 295: 7.7 3.8 6.7 2.2 virginica level1
#> 296: 7.7 3.8 6.7 2.2 virginica level2
#> 297: 7.9 3.8 6.4 2.0 virginica level1
#> 298: 7.9 3.8 6.4 2.0 virginica level2
# Dynamic data.table?
iris[, (varname) := var_levels, keyby= names(iris)]
#> Error in `[.data.table`(iris, , `:=`((varname), var_levels), keyby = names(iris)): Supplied 2 items to be assigned to group 1 of size 1 in column 'new_var'. The RHS length must either be 1 (single values are ok) or match the LHS length exactly. If you wish to 'recycle' the RHS please use rep() explicitly to make this intent clear to readers of your code.
创建于2023-11-22,共reprex v2.0.2个
我能想到的唯一解决办法是:
iris[, .(varname = var_levels) , keyby = names(iris)]
iris <- iris %>% rename({{varname}} := varname)