我正在寻找一种动态方法来指定一些“条件参数”,然后将其提供给case_when
操作或其他更适合该问题的操作。
我的目标是将条件规范与 case_when 调用分开,例如这样用户只需在文本文件或 R 中的列表中输入条件,然后我将获取该信息并将其提供给 case_when (或任何其他更合适的函数)。
假设我想在以下数据中创建一个重新编码的附加变量x
, 我可以做:
df <- data.frame(x = 1:10)
df |>
mutate(x2 = case_when(x < 4 ~ 1,
x >= 4 & x <=7 ~ 2,
TRUE ~ 3))
现在,我想要实现的是使该代码变得灵活,我可以在外部指定 case_when 条件,然后进行重新编码。
例如。它可能看起来像:
all_conditions <- list(1 = "x < 2",
2 = "x >= 2 & x < 5",
3 = "x >= 5 & x < 9",
4 = "TRUE")
然后我可以做一些事情:
df |>
mutate(x2 = do(case_when, all_conditions))
虽然该示例显示了 @Mael 解决方案适用的数字类型变量,但该解决方案也适用于条件可能类似于的字符变量x == "abc" | x == "def"
.
一个可能的解决方案,基于rlang
, 在下面。
解释
Remark
列表元素的名称all_conditions
必须用反引号括起来。
library(tidyverse)
library(rlang)
df <- data.frame(x = 1:10)
all_conditions <- list(`1` = "x < 2",
`2` = "x >= 2 & x < 5",
`3` = "x >= 5 & x < 9",
`4` = "TRUE")
code <- imap(all_conditions, ~ str_c(.x, " ~ ", .y)) %>%
str_c(collapse = ", ") %>% str_c("case_when(",.,")")
df %>%
mutate(x2 = !!parse_quo(code, env = caller_env()))
#> x x2
#> 1 1 1
#> 2 2 2
#> 3 3 2
#> 4 4 2
#> 5 5 3
#> 6 6 3
#> 7 7 3
#> 8 8 3
#> 9 9 4
#> 10 10 4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)