大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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()
处理。
以上。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196786.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...