用连字符分隔的R上的模糊字符串匹配

问题描述 投票:-1回答:1

我试图将一个表中包含的手机信号塔ID与手机信号塔ID的位置(在lat长)中的主表进行匹配。位置表中的ID格式与第一个表中的格式不同,我尝试使用agrep()进行模糊匹配。举个例子,假设我想要匹配的ID是:

x <- c("405-800-125-39883")

位于位置表中的ID示例:

y <- c("405-810-1802-19883", "405-810-2101-29883", "405-810-1401-31883",
       "405-810-5005-49883","125-39883","405-810-660-39883")

然后我使用agrep()max.distance的不同组合:

agrep(x,y,max.distance=0.3,value=TRUE)

返回:

[1] "405-810-1802-19883" "405-810-2101-29883" "405-810-1401-31883" "405-810-5005-49883"
[5] "405-810-660-39883"

虽然我真正追求的价值是"125-39883",我也尝试了stringdist_join()包中的stringdist函数,并通过改变max_dist应用于两个数据框但没有成功。基本上我正在寻找的是在最后一个连字符之后的完美匹配,然后在第二个连字符上的数字上进行匹配,依此类推。有没有办法做到这一点?

r agrep
1个回答
0
投票

你可以矢量化agrep,以便能够使用y的所有值作为模式。你的目标是将整个y作为x的一部分。因此,您的模式应该是y而不是x

names(unlist(Vectorize(agrep)(y,x)))
[1] "125-39883"   

虽然我们可以使用adistpartial=TRUE这个参数,所以它可能正是agrep所做的:

 y[which.min(c(adist(y,x,partial = T)))]
    [1] "125-39883"

如果x是一个向量而y也是一个向量,你宁愿使用adist而不是agrepagrep的所有论据都包含在adist中。查看?adist了解更多详情。

在评论中提出您的新问题,您可以执行以下操作:

w=adist(y,x,partial=T)
z=setNames(nchar(sub(".*?(M*)$","\\1",c(attr(adist(y,x,counts=T),"trafos")))),y)
names(which.max(z[which(min(w)==w)]))
[1] "126-39883"
© www.soinside.com 2019 - 2024. All rights reserved.