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

当我在条件中使用 %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
#>   colour is_warm1 is_warm2
#> 1    red     TRUE     TRUE
#> 2 orange     TRUE     TRUE
#> 3   blue    FALSE    FALSE
#> 4   <NA>       NA    FALSE

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

最佳答案

a %in% b 只是 match(a, b, nomatch = 0) > 0 的简写(检查 %in% 的源代码 让你自己确信是这样的)。

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

match(dt$colour, c("red", "orange")) > 0
#> [1] TRUE TRUE   NA   NA

这当然不需要 ifelse

https://stackoverflow.com/questions/72983277/

相关文章:

java - 使用流 groupingBy 时将字符串分组为多个组

kotlin - 如何缩短 MaterialTheme.colors.primary?

excel - 按分隔符幂查询的 X 实例拆分行

string - 如何将字符串中的 "Umlaute"(ü)转为 "ue"?

perl - 我怎样才能通过 prove (Test::More) 一个论点,例如API 网址?

dart - Dart apt repo 的 NO_PUBKEY "4EB27DB2A3B88B8B

typescript - 属性 'type' 在类型 'object' 上不存在,即使在 `"typ

sql - 如何在 Snowflake 的枢轴中使用 LISTAGG?

python - FastAPI 多个路由绑定(bind)到同一个函数。如何知道请求了哪一个

c - scanf() 不写入二维字符数组