0

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

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

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

“警告:未知级别f

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

我正在使用dplyr 0.8.0.1forcats 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”

4

1 回答 1

1

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

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

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

于 2021-01-02T23:48:13.700 回答