如何使用矢量作为列参考粘贴 data.table?

How to paste in data.table using a vector as column reference?

我正在创建一个函数,我需要在其中粘贴文本,其中包含用户传递的随机列中的值。假设我有以下数据

dt <- data.table(id = letters[1:10], amount = 1:10)
dt

我想做的是给定一个向量,它是数据中的列名,用它来粘贴

dt[,id:=paste0('id_',id)]
      id amount
 1: id_a      1
 2: id_b      2
 3: id_c      3
 4: id_d      4
 5: id_e      5
 6: id_f      6
 7: id_g      7
 8: id_h      8
 9: id_i      9
10: id_j     10

所以如果 var 是我尝试的向量

var <- 'id'
dt[,(var):=paste0('id_',eval(var))]

但是 returns

       id amount
 1: id_id      1
 2: id_id      2
 3: id_id      3
 4: id_id      4
 5: id_id      5
 6: id_id      6
 7: id_id      7
 8: id_id      8
 9: id_id      9
10: id_id     10

如何将其解释为 data.table 中的列名?

我们可以使用 get

dt[, (var) := paste0('id_', get(var))]

-输出

> dt
      id amount
 1: id_a      1
 2: id_b      2
 3: id_c      3
 4: id_d      4
 5: id_e      5
 6: id_f      6
 7: id_g      7
 8: id_h      8
 9: id_i      9
10: id_j     10

或者标准方式是.SD.SDcols

dt[, (var) := paste0('id_', .SD[[var]])]

也许你可以在 eval

中使用 str2lang
> dt[, (var) := paste0("id_", eval(str2lang(var)))][]
      id amount
 1: id_a      1
 2: id_b      2
 3: id_c      3
 4: id_d      4
 5: id_e      5
 6: id_f      6
 7: id_g      7
 8: id_h      8
 9: id_i      9
10: id_j     10

另一种选择,如果你不想重写表达式:

var = 'id'
ex = substitute(
    dt[, var := paste0('id_', var)], 
    list(var = as.name(var))
)
eval(ex)

使用 dtvar 作为名称可能会让人头疼,因为这些是 R 中包含的函数名称。