【发布时间】:2021-12-30 12:43:31
【问题描述】:
我有一个if 循环,需要进行逻辑检查。
但是检查是 x==2
这样
> x<-2
> x==2
[1] TRUE
但是当
> x<-NA
> x==2
[1] NA
我该如何处理这个问题?我在for 循环中使用此检查,循环停止执行。当x<-NA,那么x==2应该返回FALSE
【问题讨论】:
标签: r for-loop if-statement
我有一个if 循环,需要进行逻辑检查。
但是检查是 x==2
这样
> x<-2
> x==2
[1] TRUE
但是当
> x<-NA
> x==2
[1] NA
我该如何处理这个问题?我在for 循环中使用此检查,循环停止执行。当x<-NA,那么x==2应该返回FALSE
【问题讨论】:
标签: r for-loop if-statement
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 是标量,那么这也有效,因为 isTRUE(X) 仅在参数为 TRUE 时才为 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
【讨论】:
FALSE时,你不应该使用F。总有一天它会咬你!例如。见stackoverflow.com/a/70499993/2554330。
使用%in% 代替== 可能会解决此问题。
x <- 2
x %in% 2
#[1] TRUE
x <- NA
x %in% 2
#[1] FALSE
【讨论】: