R语言批量生成CaseWhen的解决方案

2023-05-16

近期写R代码,经常用dplyr::case_when结合stringr::str_detect进行条件判断。

痛点:判断条件可能会改或增删,全写在case_when里,代码冗余且不利于复制和维护,stackoverflow找了一圈,没发现好的解决方案,干脆自己写了一个通用代码以自动生成批量case_when判断。

先上代码:

allCaseWhen <<- function(x,pattern,result){
  x1 <- str_flatten(map2_chr(result,pattern,~str_glue("str_detect(x,'{.y}')~'{.x}',")))
  x2 <- str_glue("function(x) case_when({x1})")
  fx <- eval(parse(text=x2))
  fx({{x}})}

需要用到的包:

  library(purrr)
  library(stringr)

使用示例:

初始表tibble(fruit=stringr::fruit)
在这里插入图片描述
想实现字母a开头为’starts with a’,字母e结尾为’ends with e’ 等若干条件。结果如下图:
在这里插入图片描述
单纯用case_when,需要写成

tibble(fruit=stringr::fruit) %>% 
  mutate(
    category=case_when(
      str_detect(fruit,'^a')~'starts with a',
      str_detect(fruit,'e$')~'ends with e',
      str_detect(fruit,'o')~'contains o',
      str_detect(fruit,'(an)|(ch)')~'contains an or ch'
    )
  )

如果有其他表有类似的应用,你得把条件抄一遍,实在繁琐。

用改良后的allCaseWhen会简单很多,两步解决:

1. 表格形式列出条件

conditions <- 
	tribble(
	  ~pattern,~result,
	  '^a','starts with a',
	  'e$','ends with e',
	  'o','contains o',
	  '(an)|(ch)','contains an or ch'
	)

或者写在Excel里,
在这里插入图片描述
然后复制单元格,用conditions <- clipr::read_clip_tbl()读进R在这里插入图片描述

2. allCaseWhen走起

tibble(fruit=stringr::fruit) %>% 
  mutate(
    category=
      allCaseWhen(fruit,
                  conditions$pattern, #读取条件
                  conditions$result  #返回结果
                  )
  )

搞定。

函数的核心依然是case_when,条件为真即停止,所以效率上没有损失。

如果想改条件,在conditions里放肆增删改,改完再跑一遍allCaseWhen即可。
没有写默认条件,因为没必要,可以用coalesce()处理。

以上。

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

R语言批量生成CaseWhen的解决方案 的相关文章

  • simulink联合STM32CubeMX开发串口通信程序

    摘要 使用SIMULINK联合STM32CubeMX生成STM32F407串口发送数据代码 xff0c 发送的数据为正弦函数波形 再用SIMULINK写一个串口接收数据模型 xff0c 接收来自STM32发送的数据 xff0c 最后绘制出波
  • element 默认主题样式

    使用方法 span class token keyword import span ElementUI span class token keyword from span span class token string 39 elemen

随机推荐

  • 深入RUST标准库内核(一)标准库内容概述

    本书github链接 inside rust std library 本书前面章节 xff1a 深入RUST标准库内核 xff08 序言 深入RUST标准库内核 引言概述本书目的目标读者本书约定 RUST标准库体系概述core库编译器内置i
  • 深入RUST标准库内核(序言)

    对RUST的兴趣来自于Linus认真考虑将RUST作为Linux内核开发语言的新闻报道 因此开始了对RUST探索 xff0c 不久后基本上就从心底里认同了这门语言 xff0c RUST不仅是高性能及安全的语言 xff0c 它的语法设计也会带
  • 手记:把代码上传到Gitee等远程仓库的过程记录及常见问题

    很久没用git了 xff0c 指令都有点生疏了 xff0c 今天上传了一些代码到码云上 xff0c 先把过程记录下来供使用git的朋友参考 没有用图形化界面 xff0c 因为只有熟悉指令才能真正的理解领会 步骤一 xff1a 1 安装git
  • I2C总线协议原理

    首先I2C总线一共分为2根 xff0c 一根是SCL xff08 serial clock xff09 xff0c 还有一根是SDA xff08 serial data xff09 xff0c 一根是用来同步时钟的 xff0c 一根是发送接
  • 常用默认端口+URL解析+HTTP详解

    常用默认端口 http端口80 https端口443 tomcat端口8080 URL详解 http www aspxfans com 8080 news index asp boardID 61 5 amp ID 61 24618 amp
  • Vue3.0 setup函数

    setup 1 Vue3 0中一个新的配置项 xff0c 值为一个函数 2 setup是所有Composition API 组合API 表演舞台 3 组件中所用到的 xff1a 数据 方法等等 xff0c 均要配置在setup中 4 set
  • 【青训营】Go的高质量编程

    Go的高质量编程 本文内容总结自字节跳动青年训练营 第五届 后端组 什么是高质量 xff1f 各种边界条件是否完备异常情况能正常处理 xff0c 稳定性有保障易读易维护 Go语言开发者Dave Cheney指出 xff0c 编程需要遵循以下
  • c++取一个整数a从右端开始的4~7位。(注意考虑多种情况)

    c 43 43 取一个整数a从右端开始的4 xff5e 7位 xff08 注意考虑多种情况 xff09 1 思路分析及原理 4 7位的范围是10 3 10 7 1 xff0c 我们可以利用这个来判断数字的长度 从右端截取一个整数的4 7位
  • 您备案的网站未指向阿里云国内节点(不含香港)服务器,备案号可能被取消接入

    解决方法 xff1a 将你的域名添加一个二级域名 xff0c 解析到某些阿里云国内节点服务器上就行了 例如我博客域名为 www hyzhad com xff0c 就可以添加一个或者两个 A 记录 xff0c 记录值为阿里云国内节点服务器的
  • centos相关软件下载地址

    CentOS7 6 下载地址 CentOS 7 x86 64 DVD 1810 iso CentOS 7 6 DVD 版 4G http mirrors 163 com centos 7 6 1810 isos x86 64 CentOS
  • C++笔记(《C++新经典》)

    C 43 43 新经典 第1章 C C 43 43 1 1 C和C 43 43 语言的起源 特点 关系与讲解范畴1 2 C C 43 43 语言市场需求与就业需求分析1 3 再谈C C 43 43 就业1 4 搭建开发语言环境 第2章 数据
  • FileZilla连接ubuntu

    我新搭建了一个ubuntu 1 查看ssh的状态 xff1a sudo service sshd status 如果出现 xff1a ssh span class token punctuation span service span cl
  • office2016 excel复制粘贴就卡死

    原因 可能和这个帐户的缓存有关系 xff0c 或第三方软件有关系 xff0c 1 xff1a 重新安装office无效 2 xff1a 按照微软 xff0c 点文件 选项 com加载项 把里面复选框都去掉 xff0c 均无效 网上好多类似文
  • 路虽远,行则将至;事虽难,做则必成。

    新年第一天 xff0c 以奋斗为起点
  • Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“的解决办法

    在Windows系统上使用pip安装一些软件时 xff0c 会出现下面这样的问题 error Microsoft Visual C 43 43 14 0 or greater is required Get it with Microsof
  • tp5 A non-numeric value encountered解决方法

    报错信息如下 解决方法 xff1a 在对应的控制器方法加入下面这行代码即可 ini set 34 error reporting 34 34 E ALL amp E NOTICE 34
  • 自学Python day05-for循环

    语法 for 临时变量 in 序列名 xff1a xxxx 序列的意思是 xff0c 一个数据是由多个数据组成的 xff0c 例如列表 xff1a 1 2 xff0c 3 xff0c 3 xff0c 4 5 xff0c 6 7 xff0c
  • 并查集--解析关押罪犯问题(二)

    在网上看到一道ACM竞赛题 xff0c 很巧妙的运用了并查集解决了一个现实生活的问题 xff0c 然而网上的解析太少 xff0c 在这里贴出来我的思考 xff1a 题目 xff1a S 城现有两座监狱 xff0c 一共关押着N 名罪犯 xf
  • 如何在Windows下安装ubuntu子系统

    TOCM 如何在Windows下安装ubuntu子系统 1 windows设置 首先打开控制面板 xff0c Windows设置 xff0c 勾选Windows下的linux系统 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直
  • R语言批量生成CaseWhen的解决方案

    近期写R代码 xff0c 经常用dplyr case when结合stringr str detect进行条件判断 痛点 xff1a 判断条件可能会改或增删 xff0c 全写在case when里 xff0c 代码冗余且不利于复制和维护 x