考虑一个要过滤的简单数据框:
df <- data.frame(x = c('', '', NA, NA ))
> df
x
1
2
3 <NA>
4 <NA>
正如预期的那样,subset(df, x =='')
结果是:
x
1
2
然而,令我非常惊讶的是subset(df, x !='')
结果是:
[1] x
<0 rows> (or 0-length row.names)
谁能解释为什么''
在与==
一起使用时排除NA
,但在与!=
一起使用时包括NA
。除了 R 基本函数中的错误之外,这还能是什么吗?这同样适用于dplyr
filter()
:
library(dplyr)
df%>%filter(x !='')
df%>%filter(x =='')
我们可以将条件与is.na
subset(df, is.na(x) | x != "")
因为==
或!=
返回NA
任何NA
元素(即与NA
返回NA的任何比较)都存在,而不是逻辑向量。subset
和filter
删除这些NA
行,如文档所示?subset
子集 - 指示要保留的元素或行的逻辑表达式:缺失值被视为假
并在?filter
请注意,当条件的计算结果为 NA 时,该行将被删除,这与带有 [
.
即
with(df, x != "")
#[1] FALSE FALSE NA NA
with(df, is.na(x) | x != "")
#[1] FALSE FALSE TRUE TRUE