R语言实现两列字符串前8位匹配时给首列字符串加星号
问题需求
- 匹配规则:对比两个数据框中长度为8-10位的字符串列,若两个字符串至少前8位数字匹配,则给第一个数据框(
trqs)对应字符串末尾添加* - 现有问题:已实现的代码仅支持完整字符串精确匹配,无法覆盖前8位匹配的部分匹配场景
- 预期输出:
trqs$tl最终结果为c("10012908*","1001290810*","10111090")
现有原始代码
tl<-c("10012908","1001290810","10111090") trqs<-as.data.frame(tl) tl<-c("10012908","10012910") mfn<-as.data.frame(tl) for(i in 1:nrow(trqs)){ if(trqs$tl[i] %in% mfn$tl){ trqs$tl[i] <-paste0(trqs$tl[i],"*") } } #预期结果为: trqs$tl<-c("10012908*","1001290810*","10111090")
实现方案
核心逻辑:统一截取两个表待匹配字符串的前8位作为匹配键,只要trqs中记录的前8位存在于mfn的前8位集合中,就给对应字符串加星号,采用向量化运算替代逐行循环,适配8-10位长度的字符串场景,不需要额外做长度判断。
可直接运行的代码如下:
# 提取mfn表待匹配列的所有前8位前缀,作为匹配基准 mfn_prefix_set <- substr(mfn$tl, 1, 8) # 批量判断匹配,符合规则则追加星号 trqs$tl <- ifelse( substr(trqs$tl, 1, 8) %in% mfn_prefix_set, paste0(trqs$tl, "*"), trqs$tl )
运行后打印trqs$tl即可得到预期结果:
> trqs$tl [1] "10012908*" "1001290810*" "10111090"
方案说明
substr(x, 1, 8)会自动适配不同长度的输入:长度为8位的字符串会取完整值,9-10位的字符串会截取前8位,完全符合8-10位长度字符串的匹配要求- 向量化的
ifelse运算比原生for循环效率更高,数据量较大时运行速度优势明显 - 如果后续需要调整匹配前缀长度,仅需修改
substr函数中的第三个参数(结束位置)即可,无需改动其他逻辑
内容的提问来源于stack exchange,提问作者melange164
相关产品推荐
相关产品推荐

