首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与R中的max.distance相关的意想不到的agrep()结果

与R中的max.distance相关的意想不到的agrep()结果
EN

Stack Overflow用户
提问于 2009-07-25 20:10:59
回答 2查看 1.4K关注 0票数 3

编辑:这个错误是在32位版本的R中发现的,在RVersion2.9.2中得到了修正。

这是今天@leoniedu给我发的推特,我没有他的回复,所以我想我应该把它发到这里。

我已经阅读了很多关于agrep() (模糊字符串匹配)的文档,而且我似乎还不完全理解max.distance参数。下面是一个例子:

代码语言:javascript
复制
pattern <- "Staatssekretar im Bundeskanzleramt"
x <- "Bundeskanzleramt"
agrep(pattern,x,max.distance=18) 
agrep(pattern,x,max.distance=19)

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

代码语言:javascript
复制
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场?为了给你省点钱,

代码语言:javascript
复制
> nchar("Staatssekretar im Bundeskanzleramt")
[1] 34
> nchar("Bundeskanzleramt")
[1] 16
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-25 22:32:32

不久前,我在R列表上发布了这篇文章,并将其作为R- bug列表中的一个bug来报告。我没有什么有用的回答,所以我抽搐着想看看这个bug是可以复制的,还是我只是遗漏了什么。JD Long能够复制它,并善意地在这里张贴了这个问题。

请注意,至少在R中,grep是一个错误的名称,因为它不匹配正则表达式,而grep则表示“全局搜索正则表达式和打印”。它应该不会遇到比目标向量更长的模式问题。(我想!)

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

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

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

(模式,x,max.distance=31)整数(模式,x,max.distance=32)整数(0)

Linux: r版本2.9.1 (2009-06-26) x86_64-未知-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

(模式,x,max.distance=30) 1 1(模式,x,max.distance=31) 1 1(模式,x,max.distance=32)

票数 2
EN

Stack Overflow用户

发布于 2009-07-25 21:56:08

我不确定你的榜样是否合理。对于基本的grep(),模式通常是一个简单的或正则表达式,而x是其元素与模式匹配的向量。我觉得x字串的图案很奇怪。

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

代码语言:javascript
复制
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>  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1182932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档