【问题标题】:Test if variable exists in data.table测试 data.table 中是否存在变量
【发布时间】:2016-07-10 13:28:43
【问题描述】:

我想在 data.table 中做一些计算,列名可以变化。

library(data.table)
DT1 <- data.table(x=1:10,y=1:10)
DT1[,list(y+x)]

现在,如果我对不包含 y 列的 DT 执行相同的操作:

DT <- data.table(x=1:10)
DT[,list(y+x)]

我会得到一个错误。当然我可以在data.table之外做检查:

if("y" %in% names(DT))DT[,list(y+x)]

我想知道是否有办法用 data.table 本身进行测试,例如:

DT[exists("y"),y+x]

【问题讨论】:

  • DT[, if(exists("y"))y+x else x]怎么样
  • @akrun 谢谢。为什么不!如果我没有更好的解决方案,我会接受它。 ifelse 的问题,我有很多变量要测试,这将生成许多嵌套的 ifelse
  • 如果你不想要错误,你想要什么?
  • @Frank 好问题。也许什么都不做,因为没有满足条件的行。但也许我问了很多。
  • 我猜你可以使用try(DT[, list(y+x)], silent = TRUE)。我不做这么严肃的编程,所以我自己从来不需要它。省略该错误可能会让我感到困惑。

标签: r data.table


【解决方案1】:

我们可以使用if/else 条件和exists

DT[, if(exists("y")) y+x else x]

如果我们有很多变量要测试,比如 'y', 'z'

nm <- c('y', 'z')
DT[, if(Reduce(`&`, lapply(nm, exists))) y + z + x else x]

【讨论】:

  • 好吧。如果我们需要在[ì 参数中测试它,比如DT[existes(y) &amp; !is.na(y),y+x](这不起作用)?
  • @agstudy 由于 'y' 不是 'DT' 中的列,因此尽管 'i' 参数有效,但它会引发错误。
  • exists 中添加“inherits = FALSE”或指定“envir”可能会更加谨慎,因为使用全局(但不在“DT”中)y 变量exists("y")将返回TRUE
猜你喜欢
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多