R语言使用str_extract提取指定区间编码生成数据框新列
R实现编码区间提取方案
你原有str_extract的提取逻辑可以直接复用,仅需调整正则匹配规则即可,对百万级数据量的运行效率无明显影响,且和你之前生成CODE_A列的匹配标准完全统一。
匹配规则说明
两列的匹配范围严格对齐需求:
CODE_X:匹配两类编码,一是C开头、后缀数字覆盖000-999全区间的编码,二是D开头、后缀数字在000-499区间的编码CODE_Y:仅匹配D开头、后缀数字在500-999区间的编码- 非目标区间的编码会自动返回
NA(即留空),符合要求
实现代码
先确保已加载stringr包,再运行以下代码生成新列:
library(stringr) # 提取C000-C999、D000-D499区间编码到CODE_X列 dados$CODE_X <- str_extract( dados$CODE, "(?i)\\b(?:C\\W*\\d{3}|D\\W*[0-4]\\d{2})\\b" ) # 提取D500-D999区间编码到CODE_Y列 dados$CODE_Y <- str_extract( dados$CODE, "(?i)\\b(?:D\\W*[5-9]\\d{2})\\b" )
正则逻辑说明
正则完全沿用了你之前写CODE_A时的兼容规则:
- 保留
(?i)参数:不区分字母大小写,c001、d352这类小写开头的编码也可正常匹配 - 保留
\\W*逻辑:兼容字母和数字之间存在非单词字符的场景,比如C 001、D-480这类格式不会漏匹配 - 新增末尾
\\b单词边界:避免误匹配到超过3位数字的长编码(比如D4990、C1234这类不符合编码规则的值不会被提取) - 数字区间判断逻辑:
- C段直接匹配3位任意数字,全覆盖C000-C999区间
- D000-D499段:匹配D后第一位数字为0-4、后两位为任意数字的组合,刚好覆盖000-499范围
- D500-D999段:匹配D后第一位数字为5-9、后两位为任意数字的组合,刚好覆盖500-999范围
匹配效果验证
用你给出的Code示例值运行后,结果如下:
| 原始Code值 | CODE_X列值 | CODE_Y列值 |
|---|---|---|
| A005 | 空 | 空 |
| A200 | 空 | 空 |
| B300 | 空 | 空 |
| C001 | C001 | 空 |
| C999 | C999 | 空 |
| D000 | D000 | 空 |
| D352 | D352 | 空 |
| D480 | D480 | 空 |
| D501 | 空 | D501 |
| D999 | 空 | D999 |
| E480 | 空 | 空 |
特殊场景适配
如果你的Code列存在数字位数不固定的编码(比如C1、D23这类不足3位的情况),可以将正则调整为以下版本,适配可变长度数字的匹配:
# 适配数字位数不固定的CODE_X提取规则 dados$CODE_X <- str_extract(dados$CODE, "(?i)\\b(?:C\\W*\\d+|D\\W*[0-4]\\d*)\\b") # 适配数字位数不固定的CODE_Y提取规则 dados$CODE_Y <- str_extract(dados$CODE, "(?i)\\b(?:D\\W*[5-9]\\d*)\\b")
如果你的编码都是固定1位字母+3位数字的标准格式,优先使用前面的固定位数正则,匹配精度更高。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

