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、最大距離 = 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=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

于 2009-07-25T22:32:32.947 に答える
0

あなたの例が理にかなっているのかどうかはわかりません。基本的な grep() の場合、多くの場合、パターンは単純な表現または正規表現であり、x は要素がパターンに一致するベクトルです。パターンを長い文字列として持つと、x が奇妙に思えます。

substr の代わりに grep を使用する場合を考えてみましょう。

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 に答える