数据 table 早期评估值

Data table evaluating values early

我有一个循环,我试图以编程方式将多组两列加在一起。

lapply(c("V1", "V2", "V3"),
         function(x){
                   db[, x := get(paste(x, "ACC", sep = "_")) + get(paste(x, "SIC", sep = "_"))] ## e.g. INCIDENT_RATE_STD := INCIDENT_RATE_STD_ACC + INCIDENT_RATE_STD_SIC
         })

我希望 paste(x, "ACC", sep = "_") 到 return "V1_ACC" 但是在函数的操作中查看,它首先评估 x 并告诉我 V1 不存在然而。我对 R 的排序有什么误解?

在上面,db是一个data.table。

编辑:我刚刚发现问题出现在其他地方,在之前运行的代码中:

db[[x]][, LAPSE_DUR := pmin(max(tbls[[x]]$LAPSE_DUR), DURATION_Y)]

在上面,dbtbls是data.table的列表。它现在无法评估 tbls[[x]],因为它试图在 db[[x]] 环境而不是更高级别的环境中评估它。

最好使用.SDcols并添加rowSums而不是get(因为这取决于环境,另一个问题是+不会' t 照顾 NA 个元素(默认 na.rm = FALSE

library(data.table)
lapply(c("V1", "V2", "V3"), function(x)
    db[, (x) := rowSums(.SD, na.rm = FALSE), 
        .SDcols = paste(x, c("ACC", "SIC"), sep="_")][])

注意:我们使用 :=,不需要将 lapply 的输出分配给另一个对象,因为 db 会更新为新列