我有一个tibble
,其中一列是一个有序因子,其中包含分解的时间序列的组成部分的名称;我要更改这些名称,因为它们不容易理解(我不像“趋势”那样清楚地知道“级别”,“每周”和“年度”比“第一季”和“第二季”更好。)
有时我会看到“ season1”和“ season2”,但有时却是“ season”。我正在使用dplyr::mutate
,dplyr::case_when
和forcats::fct_recode
。在case_when
语句的第一个选项匹配的情况下,我希望它不会关注任何其他选项。
但是,在我测试给定级别然后更改同一级别的名称的情况下,它会发出警告
“警告:
f
中的未知级别”
有关在下一种情况下更改的级别。我知道这只是一个警告,输出是正确的,但是这很烦我,我想知道我做错了什么。
我正在dplyr 0.8.0.1
上使用forcats 0.4.0
和R 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”
答案 0 :(得分:1)
那是因为 case_when
执行了所有的右侧 (RHS)
然后保留满足左侧 (LHS) 的所有内容。
case_when
是 fct_recode(b, bar = "a")
,"a" %in% levels(b)
也会评估 FALSE
。这就是它发出警告的原因。
来自 comunity.rstudio.com 的 mishabalyasin 找到了答案。见here。