3

编辑:在 R 的 32 位版本中发现此错误已在 R 版本 2.9.2 中修复。


这是@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
4

2 回答 2

2

不久前我在 R 列表上发布了这个,并在 R-bugs-list 中报告了一个错误。我没有任何有用的回应,所以我在推特上查看该错误是否可重现,或者我只是遗漏了一些东西。JD Long 能够复制它并在这里发布问题。

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

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

Mac:sessionInfo() R 版本 2.9.1 (2009-06-26) i386-apple-darwin8.11.1 语言环境:en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US。 UTF-8

agrep(模式,x,max.distance=30) [1] 1

agrep(pattern,x,max.distance=31) integer(0) agrep(pattern,x,max.distance=32) integer(0) agrep(pattern,x,max.distance=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=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C

agrep(pattern,x,max.distance=30) [1] 1 agrep(pattern,x,max.distance=31) [1] 1 agrep(pattern,x,max.distance=32) [1] 1 agrep(模式,x,max.distance=33) [1] 1

于 2009-07-25T22:32:32.947 回答
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>  
于 2009-07-25T21:56:08.637 回答