评估包含 NA 的组合字符串

Evaluating a combined string including NA

我的目标是编码 TRUE/FALSE 评估粘贴三个字符单元格生成的字符串。以下是我所拥有的。

cond.var<-"a"
relation<-"!="
cond.value<-"1"  
a<-1

as.numeric(eval(parse(text=paste(cond.var, relation, cond.value, sep=""))))

当数字存储在 cond.value 中时,上述代码有效。最后一行returns0,是正确的。然而,当 NA 存储在 cond.value 中时(cond.value<-"NA"),最后一行 returns 只是 NA,这是不正确的。

任何解决此问题的建议将不胜感激。谢谢

您可以使用另一个函数来比较两个项目是否相同,例如identical():

> identical(1, 1)
TRUE
> identical(1, NA)
FALSE
> identical(1, 0)
FALSE
> identical(NA, NA)
TRUE

尽管这使得 relation 变量的通用性有所降低。

所以完整的解决方案是:

cond.var<-"a"
relation<-"!identical"
cond.value<-"1"  
a<-1

as.numeric(eval(parse(text=paste0(relation, '(', cond.var, ',', cond.value, ')'))))

相当骇人听闻,但无需更改您的设置即可工作 (使用 magrittr-pipe 来提高可读性)

library(magrittr)

paste("`", relation, "`(", cond.var, ", ", cond.value, ")", sep="") %>% 
    sub(paste0(cond.var, ", NA)"), paste0("is.na(", cond.var, "), TRUE)"), .) %>% 
    parse(text=.) %>% 
    eval() %>% 
    as.numeric()

你的问题的前提(a != NA returning NA 是不正确的)实际上是错误的。

NA 从字面上看,"not available." 不是 TRUEFALSE,而是未知。因此,如果我问你,"is an unknown value equal to 1?" 你的答案将是,相当合理地,"Unknown." 对 NA 值的大多数逻辑操作,例如询问 NA 是否等于 1,return NA(有有一些例外,例如另一个答案中提到的明显 is.na(NA)identical(NA, NA)

因此,如果将 NA 插入到您的原始代码中:

cond.var<-"a"
relation<-"!="
cond.value<-"NA"  
a<-1

as.numeric(eval(parse(text=paste(cond.var, relation, cond.value, sep=""))))

...最后一条命令实际上 return 不适用。您的代码工作正常。