我正在寻找一种动态方法来指定一些"条件参数",然后将其输入到case_when操作(或者其他更适合该问题的操作).

因此,我的目标是在调用时将条件的规范与case_分开,例如,用户可以在txt文件或R中的列表中键入条件,然后我会在调用时将该信息提供给case_(或任何其他函数,如果更合适的话).

假设下面的数据,我想创建一个额外的变量,重新编码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的可能解决方案.

EXPLANATION

  • 首先,我们需要使用列表all_conditions创建一个包含case_when的完整代码的字符串——这就是my imap的功能.

  • 其次,使用rlang::parse_quo,我们将字符串转换成一个表达式,在mutate中使用.

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

R相关问答推荐

无法运行通过R中的Auto.arima获得的ARIMA模型

如何在R中添加截止点到ROC曲线图?

如何在编辑列时更新可编辑数据表,并使用该表在Shiny中执行连续计算

在R中为马赛克图中的每个字段着色

使用sf或terra的LINESTRAING的累积长度

如何在ggplot中标记qqplot上的点?

如果可能,将数字列转换为整数,否则保留为数字

在rpart. plot或fancyRpartPlot中使用带有下标的希腊字母作为标签?

提取一个列表中单个列的重复观察结果R

如何使用字符串从重复的模式中提取多个数字?

以不同于绘图中元素的方式对GG图图例进行排序

随机 Select 的非NA列的行均数

基于R中的辅助向量中的值有条件地连接向量中的字符串

将文本批注减少到gglot的y轴上的单个值

在r中整理图例和堆叠图的问题

构建一个6/49彩票模拟系统

计算多变量的加权和

在不重复主题的情况下重新排列组

我怎么才能把一盘棋变成一盘棋呢?

具有某些列的唯一值的数据帧