2009-07-25 76 views
3

編輯:在R版本2.9.2中修復了32位版本的R中發現的此錯誤。意外的agrep()與R中的max.distance有關的結果


今天我在@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 
+0

http://www.nabble.com/possible-agrep-bug--R-2.9.1,-Mac-OS-X-10.5-(PR-13789)-td24285192.html – ars 2009-07-25 21:49:54

+0

跟進。這是32位R中的一個bug,它在R2.9.2中得到了修復。 (詳見Brian Ripley在8月14日在上述鏈接中的R-列表中的消息。) – 2009-09-03 01:06:49

+0

如果您可以發表該評論作爲答案,我會高興地接受並回答此問題。感謝您指出錯誤修復。 – 2009-09-03 17:01:26

回答

2

我張貼這將R名單上而回,並報告爲R-錯誤列表中的錯誤。我沒有有用的迴應,所以我小心翼翼地查看錯誤是否可重現或者我錯過了一些東西。 JD Long能夠重現它,並在此發佈問題。

需要注意的是,至少在R,那麼,AGREP是用詞不當,因爲它不比賽正則表達式,而grep的代表「全局搜索正則表達式和打印」。它應該沒有比目標矢量更長的模式問題。 (我想!)

在我的Linux服務器,一切都很好,但不是在我的Mac和Windows機器。

的Mac: sessionInfo() ř版本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(pattern,x,max.distance = 32) integer(0) AGREP(圖案,X,最大距離= 33) [1] 1

Linux操作系統: ř版本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

AGREP(圖案,X,最大距離= 30) [1] 1 AGREP(圖案,X,最大距離= 31) [1] 1個 AGREP(圖案,X,最大距離= 32) [1] 1個 AGREP(圖案,X,最大距離= 33) [1] 1

0

我不確定您的示例是否有意義。對於基本的grep(),模式通常是一個簡單或正則表達式,而x是一個元素與模式匹配的向量。模式爲更長的字符串,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>