提供(非引用)j表达式的名称作为字符向量

时间:2019-04-10 11:29:39

标签: r data.table

data.table中,对于非引用的j表达式,我希望能够使用字符向量来设置结果列的名称。

由于我处于“分组依据”设置中,因此无法使用按引用语法,因为这会引入许多重复的行。由于在这种情况下可以将j表达式指定为列表,所以我的解决方案是使用stats::setNames()。但是,这给了我一条消息(将来甚至可能变成警告)。如何在没有data.table抱怨效率的情况下实现目标?

my_fun <- function(tbl, new_names = c("mean", "var")) {
  tbl[, setNames(list(mean(b), var(b)), new_names), by = "a", verbose = TRUE]
}

dt <- data.table::data.table(
  a = sample(letters[1:5], 1e3, replace = TRUE),
  b = rnorm(1e3)
)

my_fun(dt)

结果如预期:

   a        mean       var
1: a -0.04117688 1.1080222
2: e  0.00158758 1.1629461
3: c -0.04328856 0.9848994
4: d -0.04832948 0.8760644
5: b  0.10856561 0.9313874

我想摆脱以下消息:

  

组成每个组并运行j(GForce FALSE)... j的结果是一个命名列表。为每个组一遍又一遍地创建相同的名称是非常低效的。当j = list(...)时,为了提高效率,会在分组完成后检测,删除并放回任何名称。例如,使用j = transform()可以防止加速(考虑更改为:=)。此消息将来可能会升级为警告。

1 个答案:

答案 0 :(得分:0)

将其更改为“制作每个组并运行j(GForce TRUE)... 0.000sec”:

my_fun <- function(tbl, new_names = c("a", "mean", "var")) {
  setNames(tbl[, list(mean(b), var(b)), by = "a", verbose = TRUE], new_names)
}

my_fun(dt)