【问题标题】:Data table evaluating values early早期评估值的数据表
【发布时间】:2021-10-24 05:27:56
【问题描述】:

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

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 = "_") 返回 "V1_ACC" 但是在函数的操作中,它首先评估 x 并告诉我 V1 还不存在。我对 R 的排序有什么误解?

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

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

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

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

【问题讨论】:

  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example
  • 关于您的编辑,请您显示错误消息吗? x 是什么?而且,正如您所说的,在以前工作的代码中发生了什么变化:?谢谢。

标签: r data.table lapply


【解决方案1】:

最好使用.SDcols 并添加rowSums 而不是get(因为它取决于环境,另一个问题是+ 不会处理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 会使用新列进行更新

【讨论】:

  • 您的假设是正确的 - 修改过的 OP。想要保留 NA,但这是对您提供的内容的简单修改。你知道它为什么要评估它吗?
  • @DanielV 如果有多个对象。你可以使用mget 而不是get
  • @DanielV 正如您在更新中显示的那样,使用get 有点棘手,因为它取决于指定正确的envir
猜你喜欢
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
相关资源
最近更新 更多