当我像下面这样使用case_when时,我最终得到了长度为1的输出的不必要的加倍-可能是因为case_when匹配所有可能的输出向量的长度。
a <- 1
b <- 2
decision <- case_when(
a == b ~ c("A", "B"),
a > b ~ "A",
TRUE ~ "B")
result <- decision %>% str_c("+") %>% paste(collapse = " ")
这个场景的结果是&"B+ B+&",而我只想要&"B+&"。
当a=b时,我得到" a + b +",这是我在这种情况下想要的。
有什么办法可以停止这种行为,或另一个函数?
请注意,以上只是我能写的最简单的类比。我使用case_when作为自定义函数的一部分来定义应用于众多输入变量的规则,以生成结果调用。我一直在使用链接在一起的多个if_else语句,但这有明显的可读性/编辑问题,我很兴奋地发现了case_when并使用它。
case_when/ifelse/if_else
都要求参数长度相等。这里,返回的值有的长度为2,有的长度为1。它不会像?case_when
LHS和RHS的长度相同n的值必须在所有情况下一致. n == 0的情况被视为n != 1的变体。
使用if/else
decision <- if(a == b) c('A', 'B') else if(a > b) 'A' else 'B'
测试
library(stringr)
decision %>%
str_c("+") %>%
str_c(collapse = " ")
[1] "B+"
如果我们仍然想使用case_when
,用list
包装它,以便它在所有情况下返回1的长度,然后用[[
提取list
元素
case_when(
a == b ~ list(c("A", "B")),
a > b ~ list("A"),
TRUE ~ list("B"))[[1]]
[1] "B"
如果你想使用case_when
,你也可以使用一些regex
:
a <- 1
b <- 2
decision <- case_when(
a == b ~ "A B",
a > b ~ "A",
TRUE ~ "B")
stringr::str_replace_all(decision, "([A-B])", "\1\+")