【发布时间】:2019-05-01 10:52:57
【问题描述】:
我有一个tibble,其中一列是一个有序因子,其中包含分解的时间序列的组件名称;我想更改这些,因为它们不容易理解(在我看来,“水平”不像“趋势”那么清晰,“每周”和“每年”比“季节 1”和“季节 2”更好)。
有时我得到“season1”和“season2”,但有时只是“season”。我正在使用dplyr::mutate、dplyr::case_when 和forcats::fct_recode。在case_when 语句的第一个选项匹配的情况下,我希望它不会关注其他任何选项。
但是,当我测试给定级别然后更改同一级别的名称时,它会引发警告
“警告:
f中的未知级别”
关于在下一个案例中更改的级别。我知道这只是一个警告并且输出是正确的,但这让我很烦,我想知道我做错了什么。
我在R 3.4.4 上使用dplyr 0.8.0.1 和forcats 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”作为新级别引入,因此它实际上对第二个“匹配”没有影响。您是否独立运行了两段代码?