使用stringdist::amatch未返回预期最匹配结果的问题求助
问题与解决方案
问题场景
现有两个向量,需要按末尾的6位编号一一匹配:
Filebase = c("20230523-POL3XXXXXX-000001", "20230523-POL3XXXXXX-000002", "20230523-POL3XXXXXX-000003","20230523-POL3XXXXXX-000004", "20230523-POL3XXXXXX-000005", "20230523-POL3XXXXXX-000006") lswav = c("20230523POL3XXXXXX000001_20230523.wav", "20230523POL3XXXXXX000002_20230523.wav", "20230523POL3XXXXXX000003_20230523.wav", "20230523POL3XXXXXX000004_20230523.wav", "20230523POL3XXXXXX000005_20230523.wav", "20230523POL3XXXXXX000006_20230523.wav")
直接使用stringdist::amatch匹配原始字符串时,返回结果全为第一个元素,不符合预期;提取Filebase的编号后匹配完整lswav字符串,结果也不正确。
解决方法
核心是同时提取两个向量的编号字段,基于纯编号做匹配,步骤如下:
- 提取两个向量的6位编号
# 提取Filebase末尾的6位编号 file_numbers = substr(Filebase, nchar(Filebase) - 5, nchar(Filebase)) # 提取lswav中的6位编号(用stringr定位下划线前的6位数字) library(stringr) wav_numbers = str_extract(lswav, "\\d{6}(?=_)")
- 使用
amatch基于编号匹配,映射回原始Filebase
library(stringdist) # 获取编号匹配的索引 match_idx = amatch(file_numbers, wav_numbers, maxDist = Inf) # 得到预期的匹配结果 matched_result = Filebase[match_idx]
- 验证输出
print(matched_result) # 输出: # [1] "20230523-POL3XXXXXX-000001" "20230523-POL3XXXXXX-000002" "20230523-POL3XXXXXX-000003" # [4] "20230523-POL3XXXXXX-000004" "20230523-POL3XXXXXX-000005" "20230523-POL3XXXXXX-000006"
无依赖替代方案
如果不想使用stringr,可以利用lswav字符串的固定结构提取编号:
# lswav中编号位于第16到21位 wav_numbers = substr(lswav, 16, 21)
内容的提问来源于stack exchange,提问作者Charlotte R
相关产品推荐
相关产品推荐

