当我在条件中使用 %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?
string - 如何将字符串中的 "Umlaute"(ü)转为 "ue"?
perl - 我怎样才能通过 prove (Test::More) 一个论点,例如API 网址?
dart - Dart apt repo 的 NO_PUBKEY "4EB27DB2A3B88B8B
typescript - 属性 'type' 在类型 'object' 上不存在,即使在 `"typ
sql - 如何在 Snowflake 的枢轴中使用 LISTAGG?