使用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]


以上是使用data.table`:=`动态赋值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>