dplyr::case_when 对不应评估的案例发出 RHS 警告

dplyr::case_when giving warnings about RHS of cases which should not be evaluated

我有一个 tibble,其中一列是包含分解时间序列组件名称的有序因子;我想更改这些,因为它们不容易理解("level" 在我看来不如 "trend" 清晰,"weekly" 和 "annual" 比 [=42] 更好=] 和 "season2")。

有时我得到 "season1" 和 "season2",但有时只是 "season"。我正在使用 dplyr::mutatedplyr::case_whenforcats::fct_recode。如果 case_when 语句的第一个选项匹配,我希望它不会关注任何其他选项。

但是,如果我正在测试给定级别然后更改同一级别的名称,它会发出警告

"Warning: Unknown levels in f"

关于在下一个案例中更改的级别。我知道这只是一个警告,输出是正确的,但这让我很烦,我想知道我做错了什么。

我在 R 3.4.4 上使用 dplyr 0.8.0.1forcats 0.4.0

# This throws a warning about unknown levels: a

library(dplyr)
library(forcats)

d <- tibble(a = 1:3, b = as.ordered(c("ab", "d", "e")))

d %>%
  mutate(b = case_when(
    "ab" %in% levels(b) ~ fct_recode(b, foo = "ab"),
    "a" %in% levels(b) ~ fct_recode(b, bar = "a"),
    TRUE ~ b
  ))
# This doesn't generate a warning

library(dplyr)
library(forcats)

d <- tibble(a = 1:3, b = as.ordered(c("ab", "d", "e")))

d %>%
  mutate(b = case_when(
    "ab" %in% levels(b) ~ fct_recode(b, foo = "ab"),
    "a" %in% levels(b) ~ fct_recode(b, bar = "d"),
    TRUE ~ b
  ))

预期结果:b 的级别为 "foo"、"d" 和 "e",没有投诉。

实际结果:级别正确,但是“## 警告:f 中的未知级别:a”

That's because case_when executes all of the right-hand sides (RHS) and then keeps everything that satisfies left-hand side (LHS).

即使 "a" %in% levels(b)FALSE

case_when 也会计算 fct_recode(b, bar = "a")。这就是它发出警告的原因。

mishabalyasin,来自 comunity.rstudio.com,找到了答案。参见 here