当使用等于(==)的因子对行进行子集化时,也包括NA。 %in%不会发生这种情况。这是正常的吗?

时间:2014-06-04 14:52:05

标签: r equals subset na

假设我有一个因子A有3个等级A1,A2,A3和NA' s。每个出现10例,因此共有40例。如果我做

subset1 <- df[df$A=="A1",]  
dim(subset1)  # 20, i.e., 10 for A1 and 10 for NA's
summary(subset1$A) # both A1 and NA have non-zero counts
subset2 <- df[df$A %in% c("A1"),] 
dim(subset2)  # 10, as expected
summary(subset2$A) # only A1 has non-zero count

用于子集化的变量类是因子还是整数是一样的。它是如何相等(和&gt;,&lt;)有效吗?因此,我应该坚持使用%in%因素,并且在使用相等时始终包括!is.na?谢谢!

2 个答案:

答案 0 :(得分:5)

是的,==%in%的返回类型与NA不同,因为"%in%"的定义方式......

# Data...
x <- c("A",NA,"A")

# When NA is encountered NA is returned
# Philosophically correct - who knows if the
# missing value at NA is equal to "A"?!
x=="A"
#[1] TRUE   NA TRUE
x[x=="A"]
#[1] "A" NA  "A"

# When NA is encountered by %in%, FALSE is returned, rather than NA
x %in% "A"
#[1]  TRUE FALSE  TRUE
x[ x %in% "A" ]
#[1] "A" "A"

这是因为(来自文档)......

%in%match的别名,定义为

"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0

如果我们将其重新定义为match的标准定义,您会看到它的行为方式与==相同

"%in2%" <- function(x,table) match(x, table, nomatch = NA_integer_) > 0
x %in2% "A"
#[1] TRUE   NA TRUE

答案 1 :(得分:0)

在您想要的内容(仅与您的过滤匹配的条目)与R的内容之间存在不匹配。

不同之处在于,当选择向量包括NA时,相应的条目产生输出,但值为NA。您运行的逻辑测试会产生NAs,这是问题发生的地方。

考虑以下情况:

x <- 1:10
y <- x
y[4] <- NA
ix1 <- which(x < 5)
ix2 <- which(y < 5)
x[ix1]
y[ix2]

对战:

x[x < 5]
y[y < 5]

y < 5

正是由于这种行为,我几乎从不使用v[logicalCondition]而是添加一个额外的命令来选择条目,例如ixSelect <- which(logicalCondition)。如果您需要NA,可以使用which(logicalCondition | is.na(v))