如何使用矢量作为列参考粘贴 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)
使用 dt
和 var
作为名称可能会让人头疼,因为这些是 R 中包含的函数名称。
我正在创建一个函数,我需要在其中粘贴文本,其中包含用户传递的随机列中的值。假设我有以下数据
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)
使用 dt
和 var
作为名称可能会让人头疼,因为这些是 R 中包含的函数名称。