为什么带有 %in% 的条件会忽略缺失值?

And*_*a M 2 r conditional-statements recode

当我%in%在重新编码分类变量的条件下使用时,遇到了意外的输出。

当左侧向量的元素为 时NA,条件计算结果为FALSE,而我期望它是NA

预期的行为是更详细的语句,其中两个==条件由|

dt <- data.frame(colour = c("red", "orange", "blue", NA))

# Expected
dt$is_warm1 <- ifelse(dt$colour == "red" | dt$colour == "orange", TRUE, FALSE)

# Unexpected
dt$is_warm2 <- ifelse(dt$colour %in% c("red", "orange"), TRUE, FALSE)

dt
Run Code Online (Sandbox Code Playgroud)
#>   colour is_warm1 is_warm2
#> 1    red     TRUE     TRUE
#> 2 orange     TRUE     TRUE
#> 3   blue    FALSE    FALSE
#> 4   <NA>       NA    FALSE
Run Code Online (Sandbox Code Playgroud)

这在重新编码分类变量时非常没有帮助,因为它会默默地填充缺失值。为什么会发生这种情况?是否有任何不涉及列出所有==条件的替代方案?(想象一下colour包含三十个可能的级别)。

All*_*ron 5

a %in% b只是简写match(a, b, nomatch = 0) > 0(检查源代码以使%in%自己确信情况确实如此)。

您可以通过删除参数来获得预期的结果nomatch = 0

match(dt$colour, c("red", "orange")) > 0
#> [1] TRUE TRUE   NA   NA
Run Code Online (Sandbox Code Playgroud)

这当然不需要ifelse