评估包含NA的组合字符串

时间:2019-05-10 20:09:59

标签: r eval paste 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中存储数字时起作用。最后一行返回0,这是正确的。但是,当NA存储在cond.value中(cond.value <-“ NA”)时,最后一行仅返回NA,这是不正确的。

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

3 个答案:

答案 0 :(得分:0)

您可以使用另一个函数比较两个项目是否相同,例如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, ')'))))

答案 1 :(得分:0)

很黑,但这无需更改设置即可工作 (使用magrittr管道以提高可读性)

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()

答案 2 :(得分:0)

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

NA实际上是“不可用”。不是TRUEFALSE,但未知。因此,如果我问您,“未知值等于1吗?”您的答案很合理地是“未知”。对NA值进行的大多数逻辑运算(例如询问NA是否等于1)都会返回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=""))))

...最后一条命令实际上应该返回NA。您的代码可以正常工作。