dplyr::case_when 对不应评估的案例发出 RHS 警告
dplyr::case_when giving warnings about RHS of cases which should not be evaluated
我有一个 tibble
,其中一列是包含分解时间序列组件名称的有序因子;我想更改这些,因为它们不容易理解("level" 在我看来不如 "trend" 清晰,"weekly" 和 "annual" 比 [=42] 更好=] 和 "season2")。
有时我得到 "season1" 和 "season2",但有时只是 "season"。我正在使用 dplyr::mutate
、dplyr::case_when
和 forcats::fct_recode
。如果 case_when
语句的第一个选项匹配,我希望它不会关注任何其他选项。
但是,如果我正在测试给定级别然后更改同一级别的名称,它会发出警告
"Warning: Unknown levels in 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”
That's because case_when
executes all of the right-hand sides (RHS)
and then keeps everything that satisfies left-hand side (LHS).
即使 "a" %in% levels(b)
是 FALSE
,case_when
也会计算 fct_recode(b, bar = "a")
。这就是它发出警告的原因。
mishabalyasin,来自 comunity.rstudio.com,找到了答案。参见 here。
我有一个 tibble
,其中一列是包含分解时间序列组件名称的有序因子;我想更改这些,因为它们不容易理解("level" 在我看来不如 "trend" 清晰,"weekly" 和 "annual" 比 [=42] 更好=] 和 "season2")。
有时我得到 "season1" 和 "season2",但有时只是 "season"。我正在使用 dplyr::mutate
、dplyr::case_when
和 forcats::fct_recode
。如果 case_when
语句的第一个选项匹配,我希望它不会关注任何其他选项。
但是,如果我正在测试给定级别然后更改同一级别的名称,它会发出警告
"Warning: Unknown levels in
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”
即使That's because
case_when
executes all of the right-hand sides (RHS) and then keeps everything that satisfies left-hand side (LHS).
"a" %in% levels(b)
是 FALSE
,case_when
也会计算 fct_recode(b, bar = "a")
。这就是它发出警告的原因。
mishabalyasin,来自 comunity.rstudio.com,找到了答案。参见 here。