意外的agrep()结果与R中的max.distance相关

时间:2009-07-25 20:10:59

标签: r grep agrep

编辑:在R版本2.9.2中修复了32位版本的R中发现的这个错误。


这是@leoniedu今天发给我的推文,我没有他的答案,所以我想我会在这里发布。

我已经阅读了agrep()的文档(模糊字符串匹配),看起来我并不完全理解max.distance参数。这是一个例子:

pattern <- "Staatssekretar im Bundeskanzleramt"
x <- "Bundeskanzleramt"
agrep(pattern,x,max.distance=18) 
agrep(pattern,x,max.distance=19)

表现完全像我期望的那样。字符串之间有18个字符不同,所以我希望它是匹配的阈值。这让我感到困惑:

agrep(pattern,x,max.distance=30) 
agrep(pattern,x,max.distance=31)
agrep(pattern,x,max.distance=32) 
agrep(pattern,x,max.distance=33)

为什么30和33匹配,但不是31和32?为了节省一些数,

> nchar("Staatssekretar im Bundeskanzleramt")
[1] 34
> nchar("Bundeskanzleramt")
[1] 16

2 个答案:

答案 0 :(得分:2)

我暂时将其发布在R列表中并报告为R-bugs-list中的错误。我没有任何有用的回复,所以我试图看看这个错误是否可以重现,或者我只是遗漏了一些东西。 JD Long能够重现它,并在这里发布了这个问题。

请注意,至少在R中,agrep是用词不当,因为匹配正则表达式,而grep代表“全局搜索正则表达式和打印”。对于比目标向量更长的模式,它应该没有问题。 (我想!)

在我的Linux服务器中,一切都很好但在我的Mac和Windows机器上却不是这样。

的Mac: sessionInfo() R版本2.9.1(2009-06-26) I386的苹果darwin8.11.1 区域: 的en_US.UTF-8 /的en_US.UTF-8 / C / C /的en_US.UTF-8 /的en_US.UTF-8

AGREP(图案,X,最大距离= 30) [1] 1

  

AGREP(图案,X,最大距离= 31)   整数(0)   AGREP(图案,X,最大距离= 32)   整数(0)   AGREP(图案,X,最大距离= 33)   [1] 1

Linux中: R版本2.9.1(2009-06-26) x86_64-unknown-linux-gnu

区域设置: LC_CTYPE =的en_US.UTF-8; LC_NUMERIC = C; LC_TIME =的en_US.UTF-8; LC_COLLATE =的en_US.UTF-8; LC_MONETARY = C; LC_MESSAGES =的en_US.UTF-8; LC_PAPER =的en_US.UTF-8; LC_NAME = ℃; LC_ADDRESS = C; LC_TELEPHONE = C; LC_MEASUREMENT =的en_US.UTF-8; LC_IDENTIFICATION = C

  

AGREP(图案,X,最大距离= 30)   [1] 1   AGREP(图案,X,最大距离= 31)   [1] 1   AGREP(图案,X,最大距离= 32)   [1] 1   AGREP(图案,X,最大距离= 33)   [1] 1

答案 1 :(得分:0)

我不确定你的例子是否有意义。对于基本的grep(),pattern通常是简单或正则表达式,x是一个向量,其元素与pattern匹配。将模式作为较长的字符串,x使我感到奇怪。

考虑一下我们只使用grep而不是substr:

R> grep("vo", c("foo","bar","baz"))   # vo is not in the vector
integer(0)
R> agrep("vo", c("foo","bar","baz"), value=TRUE) # but is close enough to foo
[1] "foo"
R> agrep("vo", c("foo","bar","baz"), value=TRUE, max.dist=0.25) # still foo
[1] "foo"
R> agrep("vo", c("foo","bar","baz"), value=TRUE, max.dist=0.75) # now all match
[1] "foo" "bar" "baz"
R>