【问题标题】:dplyr::case_when giving warnings about RHS of cases which should not be evaluateddplyr::case_when 对不应评估的案例的 RHS 发出警告
【发布时间】:2019-05-01 10:52:57
【问题描述】:

我有一个tibble,其中一列是一个有序因子,其中包含分解的时间序列的组件名称;我想更改这些,因为它们不容易理解(在我看来,“水平”不像“趋势”那么清晰,“每周”和“每年”比“季节 1”和“季节 2”更好)。

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

但是,当我测试给定级别然后更改同一级别的名称时,它会引发警告

“警告: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 中的未知级别”

【问题讨论】:

  • 你只有级别 c("ab", "d", "e") 因此警告。
  • 但它不应该评估那条线!
  • 为什么不在这里:"a" %in% levels(b) ~ fct_recode(b, bar = "a"),?!
  • a) 已经匹配了case_when中的第一个选项; b) "a" %in% levels(b) 是一个不匹配的条件。错误来自 fct_recode
  • 我认为第一个和第二个选项是相互独立的。第一个选项似乎没有将“a”作为新级别引入,因此它实际上对第二个“匹配”没有影响。您是否独立运行了两段代码?

标签: r dplyr case-when forcats


【解决方案1】:

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

case_when 将评估fct_recode(b, bar = "a"),即使"a" %in% levels(b)FALSE。这就是它发出警告的原因。

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

【讨论】:

    猜你喜欢
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2018-06-09
    • 1970-01-01
    • 2020-08-30
    • 2011-06-15
    相关资源
    最近更新 更多