r语言 - 使用不同长度的向量输出的case_when -我可以避免这种加倍行为吗?



当我像下面这样使用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\+")

相关内容

  • 没有找到相关文章

最新更新