使用data.table`:=`动态赋值
我正在尝试使用以下代码在 data.table 中设置一系列值:
db[, `:=`(paste("PAID", c("A", "B", "C"), sep = "_") = .SD * COST,
paste("PAID_NET", c("A", "B", "C"), sep = "_") = .SD * COST * (1 - TAX))
, .SDcols = paste("PRICE", c("A", "B", "C"), sep = "_")]
如果没有paste涉及,这些会起作用,但是有,所以没有。
期望的行为是基于 SOLD_A、SOLD_B、SOLD_C、COST 和 TAX 创建 6 个新列,PAID_A、PAID_B、PAID_C、PAID_NET_A、PAID_NET_B、PAID_NET_C。
怎么了?
回答
在 lhs 上设置名称=不会按预期工作。我们可以做
nm1 <- paste("PAID", c("A", "B", "C"), sep = "_")
nm2 <- paste("PAID_NET", c("A", "B", "C"), sep = "_")
nm3 <- paste("PRICE", c("A", "B", "C"), sep = "_")
db[, c(nm1, nm2) := c(.SD * COST,
.SD * COST * (1 - TAX)),
, .SDcols = nm3]
或者另一种选择是 setNames
db[, `:=`(setNames(.SD * COST, .SD * COST * (1 - TAX), c(nm1, nm2))),
.SDcols = nm3]