R中能否用case_when返回grepl匹配的非静态内容?有无更优方案?
问题答复
能否通过case_when实现
可以实现。grepl仅返回逻辑判断结果,你需要搭配正则提取函数获取匹配到的具体内容,示例代码如下:
library(stringr) frame %<>% mutate( columnA = case_when( str_detect(columnB, "WXYZ *[1-9]{1,2}") ~ str_extract(columnB, "WXYZ *[1-9]{1,2}") ) )
上述代码中str_detect作用和grepl一致,仅做正则匹配判断,匹配成功的分支返回对应提取到的内容,无匹配的条目默认返回NA,和你原有逻辑完全一致。
更优的实现方案
无需使用case_when做冗余判断,直接调用正则提取函数即可,提取函数本身在未匹配到对应内容时就会返回NA,和你原有case_when无匹配分支的行为完全一致,代码更简洁,也避免重复写两次正则规则带来的出错风险:
library(stringr) frame %<>% mutate( columnA = str_extract(columnB, "WXYZ *[1-9]{1,2}") )
如果不想额外加载stringr包,也可以用Base R原生函数实现:
frame %<>% mutate( columnA = regmatches(columnB, regexpr("WXYZ *[1-9]{1,2}", columnB), nomatch = NA) )
内容的提问来源于stack exchange,提问作者The Count
相关产品推荐
相关产品推荐

