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


相关推荐

  • 分布式事务框架Seata

    分布式事务框架Seata分布式事务中常见的三种解决方案目录一、分布式事务前奏 二、柔性事务解决方案架构 (一)、基于可靠消息的最终一致性方案概述 (二)、TCC事务补偿型方案 (三)、最大努力通知型 三、基于可靠消息的最终一致性方案详解 (一)、消息发送一致性 (二)、保证消息一致的变通做法 (三)、常规MQ消息处理流程和特点 (四)、消息重复发送问题和业务接口幂等性设计 (五)、本地消息服务方案 (六)、独立消息服务方案 (七)、消息服务子系统的设计实现 一、分布式事务

    2025年7月11日
    2
  • yui java 右键_给YUI Compressor添加右键命令,完成快捷压缩[通俗易懂]

    yui java 右键_给YUI Compressor添加右键命令,完成快捷压缩[通俗易懂]YUICompressor默认不带右键安装功能YUICompressor非常好用,特别是JS的混淆是众多JSCoding的最爱。可惜官网提供的版本都不具备右键功能,每次压缩都要cmd输入一些命令实在是繁琐,本文就介绍如何给YUICompressor添加右键命令,方便使用。网上已有一些网友写好的安装包,但对应的版本太低,目前最新最多人使用的还是2.4.7版本,而这一版本的带右键功能目前没有在…

    2022年7月18日
    13
  • pycharm好用的主题_pycharm关联python

    pycharm好用的主题_pycharm关联python所谓工欲善其事,必先利其器;在我们日常开发中,长时间编码从眼睛上心里承受压力上有个好的视觉感觉是很加分的以下是我个人十分喜欢的pycharm主题风格,包含整体风格/字体/背景颜色/背景图片;其设置如下:01主题:pycharm的File->Settings->Plugins,搜索MaterialThemeUI并安装,安装之后进行restart02字体:File…

    2022年8月26日
    8
  • Java中的LinkedList的方法的应用

    Java中的LinkedList的方法的应用LinkedList其实也就是我们在数据结构中的链表,这种数据结构有这样的特性:分配内存空间不是必须是连续的;插入、删除操作很快,只要修改前后指针就OK了,时间复杂度为O(1);访问比较慢,必须得从第一个元素开始遍历,时间复杂度为O(n);在Java中,LinkedList提供了丰富的方法,可以模拟链式队列,链式堆栈等数据结构,为用户带来了极大的方便,下面看看这些方法的用法:addboole

    2022年6月16日
    29
  • 1040. 有几个PAT(25)- PAT乙级真题

    1040. 有几个PAT(25)- PAT乙级真题1040.有几个PAT(25)字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T);第二个PAT是第3位(P),第4位(A),第6位(T)。现给定字符串,问一共可以形成多少个PAT?输入格式:输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。输出格式:在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对…

    2022年5月1日
    45
  • 图像形态学操作—腐蚀扩展深度

    图像形态学操作—腐蚀扩展深度

    2022年1月14日
    49

发表回复

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

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