如何检查列表是否包含“NA”?
How to check whether a list contains `NA`?
当右边是向量时,%in%
可以用来检查NA
s:
> NA %in% c(NA, 2)
[1] TRUE
> NA %in% c(1, 2)
[1] FALSE
> 1 %in% c(NA, 2)
[1] FALSE
> 1 %in% c(1, 2)
[1] TRUE
当右侧是列表时,%in%
表现不同:
> NA %in% list(NA, 2)
[1] FALSE
> NA %in% list(1, 2)
[1] FALSE
> 1 %in% list(NA, 2)
[1] FALSE
> 1 %in% list(1, 2)
[1] TRUE
这是错误还是功能?文档中是否对此进行了描述?
我们可以使用anyNA
anyNA(list(NA, 2))
如果 list
的 vector
长度 > 1,则使用 recursive = TRUE
anyNA(list(c(1, 2), c(NA, 1)), recursive = TRUE)
#[1] TRUE
回答我的第二个问题:是的,这个现象在文档中有描述(当然):
Factors, raw vectors and lists are converted to character vectors [...]
因此,list(NA, 2)
被强制转换为 c("NA", "2")
。显然,NA
不在c("NA", "2")
中。因此,应该使用anyNA
。
我的个人要点:尽量避免 %in%
右侧由列表组成。
当右边是向量时,%in%
可以用来检查NA
s:
> NA %in% c(NA, 2)
[1] TRUE
> NA %in% c(1, 2)
[1] FALSE
> 1 %in% c(NA, 2)
[1] FALSE
> 1 %in% c(1, 2)
[1] TRUE
当右侧是列表时,%in%
表现不同:
> NA %in% list(NA, 2)
[1] FALSE
> NA %in% list(1, 2)
[1] FALSE
> 1 %in% list(NA, 2)
[1] FALSE
> 1 %in% list(1, 2)
[1] TRUE
这是错误还是功能?文档中是否对此进行了描述?
我们可以使用anyNA
anyNA(list(NA, 2))
如果 list
的 vector
长度 > 1,则使用 recursive = TRUE
anyNA(list(c(1, 2), c(NA, 1)), recursive = TRUE)
#[1] TRUE
回答我的第二个问题:是的,这个现象在文档中有描述(当然):
Factors, raw vectors and lists are converted to character vectors [...]
因此,list(NA, 2)
被强制转换为 c("NA", "2")
。显然,NA
不在c("NA", "2")
中。因此,应该使用anyNA
。
我的个人要点:尽量避免 %in%
右侧由列表组成。