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

时间:2019-05-01 10:52:58

标签: r dplyr case-when forcats

我有一个tibble,其中一列是一个有序因子,其中包含分解的时间序列的组成部分的名称;我要更改这些名称,因为它们不容易理解(我不像“趋势”那样清楚地知道“级别”,“每周”和“年度”比“第一季”和“第二季”更好。)

有时我会看到“ season1”和“ season2”,但有时却是“ season”。我正在使用dplyr::mutatedplyr::case_whenforcats::fct_recode。在case_when语句的第一个选项匹配的情况下,我希望它不会关注任何其他选项。

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

  

“警告:f中的未知级别”

有关在下一种情况下更改的级别。我知道这只是一个警告,输出是正确的,但是这很烦我,我想知道我做错了什么。

我正在dplyr 0.8.0.1上使用forcats 0.4.0R 3.4.4

# 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”

1 个答案:

答案 0 :(得分:1)

<块引用>

那是因为 case_when 执行了所有的右侧 (RHS) 然后保留满足左侧 (LHS) 的所有内容。

即使 case_whenfct_recode(b, bar = "a")

"a" %in% levels(b) 也会评估 FALSE。这就是它发出警告的原因。

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