评估包含 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." 不是 TRUE
或 FALSE
,而是未知。因此,如果我问你,"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 不适用。您的代码工作正常。
我的目标是编码 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." 不是 TRUE
或 FALSE
,而是未知。因此,如果我问你,"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 不适用。您的代码工作正常。