【问题标题】:Fuzzy String Matching in R on numbers separated by hyphensR中用连字符分隔的数字的模糊字符串匹配
【发布时间】:2018-03-04 06:53:15
【问题描述】:

我正在尝试将一张表中包含的手机塔 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 包中的stringdist_join() 函数,并将其应用于两个不同max_dist 的数据框,但没有成功。基本上,我正在寻找的是最后一个连字符之后的完美匹配,然后是倒数第二个连字符上的数字,依此类推。有什么办法吗?

【问题讨论】:

  • 如果你正在寻找一个完全匹配然后去掉子字符串然后做==y[y == substring(x, 9)]
  • 感谢@akrun,但不完全是。我分享的数据只是一个演示样本。您的解决方案将适用于这个特定示例。但是,该值也可能存储为"800-125-39883""5-800-125-39883"。所以不能在substring()中真正指定9
  • 问题在于,在 agrep 或其他中,它与其他数字匹配,并且无法真正区分最后几个元素。我最好提供所有案例的例子
  • @akrun 只是在这里大声思考,但是您认为拆分“-”然后从最后一个值开始匹配会有所帮助吗?我觉得可能但不确定如何做到这一点。
  • 我仍然不清楚你匹配的是哪些数字

标签: r agrep


【解决方案1】:

您可以矢量化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

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

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"

【讨论】:

  • 谢谢@Onyambu。但是我认为我应该匹配最后一组数字。例如,如果y &lt;- c("405-810-1802-19883", "405-810-2101-29883", "405-810-1401-31883", "405-810-5005-49883","125-49883","405-810-660-39883","126-39883"),那么我感兴趣的结果将是"126-39883",而不是您的代码返回的"125-49883"
  • 问题是您没有在原始问题中说明这一点。始终确保给出一个能抓住你的问题的例子
  • 同意,我的错。
猜你喜欢
  • 2015-03-26
  • 2017-08-03
  • 2018-03-23
  • 1970-01-01
  • 2012-02-14
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多