如何匹配一个字符的容差?

时间:2016-06-01 03:35:12

标签: r agrep

我有一个位置向量,我试图消除正确位置名称向量的歧义。 对于这个例子,我只使用了两个消除歧义的位置:

agrepl('Au', c("Austin, TX", "Houston, TX"), 
max.distance =  .000000001, 
ignore.case = T, fixed = T)
[1] TRUE TRUE

帮助页面显示max.distance

  

匹配所允许的最大距离。表示为整数,或表示模式长度的一部分乘以最大转换成本

我不确定Levensthein距离的数学意义;我的理解是距离越小,对我的歧义字符串向量的不匹配的容忍度就越严格。

所以我会调整它以检索两个FALSE ?基本上我只想在1个字符的差异时才有TRUE,如:

agrepl('Austn, TX', "Austin, TX", 
max.distance =  .000000001, ignore.case = T, fixed = T)
[1] TRUE

1 个答案:

答案 0 :(得分:1)

您遇到的问题可能类似于我在这里开始实验时遇到的问题。当fixed = TRUE时,第一个参数是正则表达式模式,因此如果不限制为完整字符串,则小模式是非常宽松的。帮助页面甚至有关于该问题的“注意”:

  

由于不经意地阅读描述的人甚至提交了错误报告,请注意这与x的每个元素的子串匹配(就像grep一样)而不是整个元素。

使用正则表达式模式,您可以将pattern字符串放在“^”和“$”旁边,因为与adist不同,agrepl没有部分参数:

> agrepl('^Au$', "Austin, TX", 
+ max.distance =  c(insertions=.15),  ignore.case = T, fixed=FALSE)
[1] FALSE
> agrepl('^Austn, TX$', "Austin, TX", 
+ max.distance =  c(insertions=.15),  ignore.case = T, fixed=FALSE)
[1] TRUE
> agrepl('^Austn, T$', "Austin, TX", 
+ max.distance =  c(insertions=.15),  ignore.case = T, fixed=FALSE)
[1] FALSE

所以你需要使用这些flankers来粘贴0:

> agrepl( paste0('^', 'Austn, Tx', '$'), "Austin, TX", 
+ max.distance =  c(insertions=.15),  ignore.case = T, fixed=FALSE)
[1] TRUE
> agrepl( paste0('^', 'Au', '$'), "Austin, TX", 
+ max.distance =  c(insertions=.15),  ignore.case = T, fixed=FALSE)
[1] FALSE

最好使用all而不仅仅是insertions,您可能希望降低分数。