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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【spring-kafka】@KafkaListener详解与使用

    【spring-kafka】@KafkaListener详解与使用说明从2.2.4版开始,您可以直接在注释上指定Kafka使用者属性,这些属性将覆盖在使用者工厂中配置的具有相同名称的所有属性。您不能通过这种方式指定group.id和client.id属性。他们将被忽略;可以使用#{…​}或属性占位符(${…​})在SpEL上配置注释上的大多数属性。比如:@KafkaListener(id=”consumer-id”,topics=”SHI_TOPIC1″,concurrency=”${listen.concurrency:3}”,

    2022年10月14日
    2
  • iOS 学习视频 资料集合 (视频 +博客)[通俗易懂]

    iOS 学习视频 资料集合 (视频 +博客)[通俗易懂]转载:https://blog.csdn.net/yst19910702/article/details/78809472无意间在网上发现一些学习资源,分享下。资源主要是一些视频资源和博客网站。这些资源主要针对一些初中学着。利用一些基础知识点,中级有小码哥的视频里的视频和组件化。(后面有些博客真的很不错)。总之都是杂七杂八的,分享出来旨在共同学习。有不好的地方还望指教。 虽然都是一些培训班的视频,…

    2022年7月27日
    6
  • MySQL-深入分析MySQL ERROR 1045出现的原因

    MySQL-深入分析MySQL ERROR 1045出现的原因1

    2022年6月14日
    25
  • Lunix操作「建议收藏」

    Lunix操作「建议收藏」pwd当前目录ls显示文件ls-a显示所有文件wenjianls-a~显示所有隐藏文件权限 用户所有者 文件大小 修改时间戳  文件名如果 test不存在使用 -p删除文件夹下所有文件和子目录删除一个目录-i带有交互的询问通配符匹配…

    2022年10月3日
    3
  • 设计测试用例的方法

    设计测试用例的方法如果测试的时间有限,如何保证在有限的时间内让产品上线?(1)有限的时间内测试,保证用户经常使用(使用频率比较高,主要的,核心的功能)功能的质量(2)如果有限的时间所有的功能不能完全测完,可以和产品经理开发商量,把没有通过测试的,有风险的功能把用户的入口,屏蔽掉(让用户无法使用),产生错误风险就会降低(3)本次测试,测试报告写清楚,这次上线,哪些功能测试了,哪些功能没有测试,上线风险分析清楚。百度云盘的测试用例太多了,如何去写?(1)用户经常使用的功能有哪些?文件的存储(长传,接受)下载分享

    2022年6月20日
    24
  • 测试用例设计的八大要素及ANSI/IEEE 829标准和编写示例[通俗易懂]

    测试用例设计的八大要素及ANSI/IEEE 829标准和编写示例[通俗易懂]1、测试用例的八大要素1.用例编号和其他编号一样,测试用例编号是用来唯一识别测试用例的编号,要求具有易识别和易维护性,用户可以很容易根据用例编号获取到相应用例的目的和作用,在系统测试用例中,编号的一般格式为A-B-C-D这几部分的作用分别如下:A:产品或项目类型,如CMS(内容管理系统)、CRM(客户关系管理系统)B:一般用来说明用例的属性,如ST(系统测试)、IT(集成测试)、UT(单元测试)C:测试需求的表示,说明该用例针对的需求点,可包括测试项和测试子项等,如文档管理、客户投诉信息管理

    2022年6月28日
    38

发表回复

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

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