我想在data.table中复制dplyr的行为,以便通过group_byreframe扩展行.我可以通过自己设置列名来完成,但如果我设置动态列名(即,基于外部向量).示例如下:

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)

推荐答案

data.table的说法中,因为您是按所有预先存在的列进行分组,所以我们不需要:=-Assignment,我们希望返回单个列,并让data.table保留已分组的列.您从.(varname = var_levels)步开始走上了正确的道路,我们只需要一种动态命名列的方法.我们可以使用setNames/list(var_levels)来实现这一点.

irisDT <- as.data.table(iris)
out <- irisDT[, setNames(list(var_levels), varname), keyby = names(irisDT)]
irisDT %>% 
  group_by(pick(everything())) %>% 
  reframe({{varname}} := var_levels) %>%
  all.equal(out, check.attributes = FALSE)
# [1] TRUE

R相关问答推荐

rvest函数read_html_live()不允许html_elements()正确读取

在集合群体模型中计算时间步依赖的速率/参数

在ggplot的注释表格中突出显示最大值

如果行和列名以相同的开头,将矩阵值设置为0

带有gplot 2的十字舱口

无法将传奇添加到cowplot多情节中

R Sapply函数产生的值似乎与for循环方法略有不同

如何根据R中其他列的值有条件地从列中提取数据?

try 将 colored颜色 编码添加到ggploly的标题中

将二进制数据库转换为频率表

从R中的对数正态分布生成随机数的正确方法

根据列表中项目的名称合并数据框和列表

R中的类别比较

如何在R中改变fviz_pca_biplot中圆的边界线的 colored颜色 ?

数值型数据与字符混合时如何进行绑定

填充图例什么时候会有点?

R-找出存在其他变量的各种大小的所有组合

禁用时,SelecizeInput将变得不透明

分隔日期格式为2020年7月1日

conditionPanel不考虑以下条件