动态“case_when”允许不同数量的条件和条件本身

2024-02-21

我正在寻找一种动态方法来指定一些“条件参数”,然后将其提供给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, 在下面。

解释

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

  • 二、使用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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态“case_when”允许不同数量的条件和条件本身 的相关文章

  • R:如何改变格子(levelplot)颜色主题?

    我安装的默认主题是将值映射为粉色和青色的主题 例如如何将其更改为灰度主题 您可以使用 library lattice lattice options default theme standard theme color FALSE 它会打开
  • 替换 R 中的缺失值

    我必须通过 ID 将缺失值替换为最大值 值 如何在 R 中做 ID Value 1 NA 5 15 8 16 6 8 7 65 8 NA 5 25 1 62 6 14 7 NA 9 11 8 12 9 36 1 26 4 13 我首先使用调
  • dplyr 中 select() 的 contains() 和 matches() 之间的区别

    我决定花一些时间彻底学习dplyr 我刚刚遇到select 函数以及它附带的一些辅助函数 通过只是玩弄 我没能发现两者之间的任何区别contains and matches辅助功能 有人可以提供一个例子来说明如何将它们用于不同的目的吗 谢谢
  • 如何将函数应用于表以将 P 值输出为新行

    我有这个简单的数据框 sum 列表示行的总和 我想使用 prop test 来确定每列的 P 值 并将该数据显示为标记为 p 值的附加行 我可以按以下方式使用 prop test 来确定任何单个列的 p 值 但无法弄清楚如何使用单个函数将其
  • 如何用 df 中的字符替换 NA [重复]

    这个问题在这里已经有答案了 我希望在 df 中将所有 NA 替换为 Not Found 我有这个 df A B 1 NA 2 NA 3 NA 我怎样才能得到那个 A B 1 Not Found 2 Not Found 3 Not Found
  • RcppEigen 包“#pragma clang Diagnostic pop”警告

    我在尝试使用时遇到一些问题RcppEigen包裹 我使用了发布的示例here http gallery rcpp org articles eigen eigenvalues 该函数有效 但 R 生成了一系列类似的警告 示例如下 In fi
  • glm 起始值不被接受日志链接

    我想运行带有日志链接和偏移量的高斯 GLM 出现以下问题 y lt c 1 1 0 0 t lt c 5 3 2 4 没问题 exp coef glm y 1 offset log t family poisson with family
  • 如何找出正在使用哪个(版本的)函数?

    问题 如何找出正在调用的函数的版本 例如 如果我使用unique在 data frame 上 我假设我正在使用unique data frame 然而 没有unique raster函数 虽然有一个raster unique 但如果我使用
  • 删除数据框值的后缀

    我有一个这样完成的数据框 a b c 1 2011 mal ID9 2 2012 yesterday ID10 3 2010 misch ID10 4 1995 ship ID9 5 2008 se ID9 6 1998 falling I
  • 在 blogdown 中包含图像预览(.Rmd yaml 标头)

    我尝试了几种方法 但到目前为止都没有效果 我想在我的主博客页面上添加用 R markdown Rmd 编写的博客文章的图像预览 其中通常会显示许多帖子和项目 我可以使用以下从 Hugo 获取的代码使其在普通 markdown md 中工作a
  • 绘图不适合 R 窗口

    我正在使用metaR 中的包对比例进行荟萃分析 我的分析中有大约一百项研究 当我打字时forest result 创建我的森林图 它可以工作 但图形在顶部和底部被切掉 无论我做什么 它都不适合绘图窗口 我对如何解决这个问题感到困惑 有任何想
  • 展平 ggplot2 中的 alpha 通道

    ggplot2 的某些对象 函数 支持 alpha 通道 http docs ggplot2 org current geom point html http docs ggplot2 org current geom point html
  • 不同大小组的高效递归随机抽样

    这个问题是我之前关于递归随机抽样问题的后续问题高效的递归随机采样 https stackoverflow com questions 69824065 efficient recursive random sampling 当组大小相同或每
  • 数据集子集的回归

    我想做以下事情并需要一些帮助 分别计算 身高 与 年龄 的斜率和截距 lm Height Age 一 每个人 二 性别 并创建一个包含结果 斜率和截距 的表 我可以使用 申请 吗 在下一步中 我想做一个统计测试 以确定性别之间的斜率和截距是
  • 中断、保存并稍后继续循环的最佳方法

    事情是这样的 我有一个需要几天时间才能运行的循环 我想中断循环 检查进度 然后稍后继续 目前 我正在使用以下内容 for i in 1 100000 Sys sleep i 2 5 print i write csv i i csv 我检查
  • 评估 R 中字符串指向的函数

    假设我有以下内容 x lt 1 10 squared lt function x x 2 y lt squared 我希望能够使用 y 定义的字符串来评估该函数 像 eval y 这样的东西 我知道这是错误的 但会返回 1 1 4 9 16
  • 为 PDF 输出添加 natbib 选项

    有没有办法指定natibib输出 PDF 时的选项bookdown 我希望 tex 输出具有命令 usepackage sort compress natbib 但似乎没有任何方法可以在 YAML 中指定它 我无法将命令添加到我的序言中 因
  • 有没有办法将字母扩展到超过 26 个字符,例如 AA、AB、AC...?

    我大部分时间都使用字母来表示我的因素 但今天我尝试超过 26 个字符 LETTERS 1 32 期待有自动递归因式分解 AA AB AC 但很失望 这只是字母的限制还是有办法使用其他函数来获取我正在寻找的内容 702够吗 LETTERS70
  • 抑制 r markdown 中的控制台输出,但保留绘图

    嗨 我有以下降价块 r echo FALSE warning FALSE message FALSE error FALSE lapply obj function x plot x main some plot box axis 1 at
  • 不同的分位数:箱线图与小提琴图

    require ggplot2 require cowplot d iris ggplot2 ggplot d aes factor 0 Sepal Length geom violin fill black alpha 0 2 draw

随机推荐