数据 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)]
在上面,db
和tbls
是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
会更新为新列
我有一个循环,我试图以编程方式将多组两列加在一起。
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)]
在上面,db
和tbls
是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
会更新为新列