You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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字符串,结果也不正确。

解决方法

核心是同时提取两个向量的编号字段,基于纯编号做匹配,步骤如下:

  1. 提取两个向量的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}(?=_)")
  1. 使用amatch基于编号匹配,映射回原始Filebase
library(stringdist)
# 获取编号匹配的索引
match_idx = amatch(file_numbers, wav_numbers, maxDist = Inf)
# 得到预期的匹配结果
matched_result = Filebase[match_idx]
  1. 验证输出
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:24:58