-1

我正在尝试将一张表中包含的手机塔 ID 与手机塔 ID 的位置主表(以纬度为单位)进行匹配。位置表中的 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,但没有成功。基本上,我正在寻找的是最后一个连字符之后的完美匹配,然后是倒数第二个连字符上的数字,依此类推。有没有办法做到这一点?

4

1 回答 1

0

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

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

尽管我们可以使用adistwith 参数partial=TRUE,以便它可以完全agrep执行以下操作:

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

如果x是一个向量并且y也是一个向量,你宁愿使用adist而不是agrep. 的所有参数agrep都包含在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"
于 2018-03-04T07:34:51.890 回答