我有一个
if
循环,需要逻辑检查。
但是检查是 x==2
这样
> x<-2
> x==2
[1] TRUE
然而当
> x<-NA
> x==2
[1] NA
我该如何处理这个问题?我在
for
循环中使用此检查,循环停止执行。当 x<-NA
时,x==2
应返回 FALSE
1) 首先确保 x 不为 NA,然后进行 AND 所需的检查。 如果 x 为 NA,那么它会减少为 FALSE & NA,并且等于 FALSE。
x <- c(1, NA, 2) # test input
(!is.na(x)) & x == 2
## [1] FALSE FALSE TRUE
2) 如果 x 是标量,那么这也有效,因为只有当参数为 TRUE 时,isTRUE(X) 才为 TRUE,如果它是包括 NA 在内的其他任何内容,则为 FALSE。
x <- 2
isTRUE(x == 2)
## [1] TRUE
x <- 0
isTRUE(x == 2)
## [1] FALSE
x <- NA
isTRUE(x == 2)
## [1] FALSE
2a) 或者如果 x 不一定是标量,我们可以这样修改它
x <- c(1, NA, 2) # test input
sapply(x == 2, isTRUE)
## [1] FALSE FALSE TRUE
2b) 或
x <- c(1, NA, 2) # test input
Vectorize(isTRUE)(x == 2)
## [1] FALSE FALSE TRUE
您可能想尝试:
x <- 2
ifelse(is.na(x), FALSE, x == 2)
#> [1] TRUE
x <- NA
ifelse(is.na(x), FALSE, x == 2)
#> [1] FALSE
使用
%in%
而不是 ==
这可能会解决此问题。
x <- 2
x %in% 2
#[1] TRUE
x <- NA
x %in% 2
#[1] FALSE
只是一个评论。 Na 的语义类似于“值未知”。因此,如果 x 是 Na,并且您询问 x 是否等于 2,则正确答案实际上是 Na,因为它是未知的。 X==2 无法被证明和排除。