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

R语言批量生成CaseWhen的解决方案R语言case_when批量生成自定义函数

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

近期写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()处理。

以上。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196786.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JVM内存管理及GC机制[通俗易懂]

    JVM内存管理及GC机制[通俗易懂]一、概述JavaGC(GarbageCollection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。经过这么长时间的发展,JavaGC…

    2022年5月2日
    36
  • 菜鸟浅谈——web安全测试[通俗易懂]

    菜鸟浅谈——web安全测试[通俗易懂]本文仅为小白了解安全测试提供帮助一:安全测试注意事项1)要注意白帽子与黑客之间的区别2)在挖漏洞挣外快时,注意不要使用安全扫描或暴力激活成功教程软件对上线网站进行扫描或攻击。不要对上线网站造成破坏,不要去获取网站的数据库信息等。否则等待的不是money,而是牢狱啦~~二:web介绍1)worldwideweb万维网,也被叫做www(3w),非常普遍的互联网应用,每天都有数以亿万…

    2022年9月19日
    0
  • pycharm控制台不见了_pycharm中文注释乱码

    pycharm控制台不见了_pycharm中文注释乱码修改远程服务器编码为UTF-8修改本地服务器编码为UTF-8IDE设置工程编码等为UTF-8设置本地环境变量修改pycharm64.exe.vmoptions文件,添加一行:-Dfile.encoding=UTF-8单个文件修改默认编码为utf-8在文件的最顶部添加代码:#!/usr/bin/envpython#-*-encoding:utf-8-*-…

    2022年8月25日
    3
  • java socket通讯中文乱码问题

    java socket通讯中文乱码问题话不多说上代码publicvoidrun(){//客户端一连接就可以写数据给服务器了newsendMessThread().start();super.run();try{//读Sock里面的数据InputStreams=socket.getInputStream();byte[]buf=newbyte[1024];

    2022年7月26日
    18
  • C++面试题之虚函数(表)实现机制

    C++面试题之虚函数(表)实现机制前言大家都应该知道C++的精髓是虚函数吧?虚函数带来的好处就是:可以定义一个基类的指针,其指向一个继承类,当通过基类的指针去调用函数时,可以在运行时决定该调用基类的函数还是继承类的函数.虚函数是实现多态(动态绑定)/接口函数的基础.可以说:没有虚函数,C++将变得一无是处!既然是C++的精髓,那么我们有必要了解一下她的实现方式吗?有必要!既然C++是从C语言的基础上发展而来…

    2022年7月13日
    13
  • 国内能用的国际邮箱推荐哪个?公司邮箱号码大全「建议收藏」

    国内能用的国际邮箱推荐哪个?公司邮箱号码大全「建议收藏」在网上看到大家一直在讨论国际邮箱哪个好用,TOM、163、gmail等,在国内用哪个邮箱呢?外贸公司需要跟客户沟通合同信息、物流货代公司需实时沟通货柜清关进展、电商公司采购出口需跟国外办事处或客户沟通、软件信息公司老板是老外,也必须用国际邮箱,这些使用邮箱的人90%都会在国内用邮箱,所以在国内能的国际邮箱是刚需。国内能用的国际邮箱推荐常用个人邮箱,但进了公司用企业邮箱才发现真的不一样。TOM企业邮箱是我在大学里看到老师用过的,现在公司分配了一个给我,之前的个人邮箱Facebook验证码都收不到,公司的这

    2022年9月24日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号