Rでmax.distanceに関連する予想外AGREP()結果
質問
編集:のこのバグは、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)
なぜ31と32 30と33試合があるが、?あなたにいくつかのカウントを保存するには、
> nchar("Staatssekretar im Bundeskanzleramt")
[1] 34
> nchar("Bundeskanzleramt")
[1] 16
解決
私はしばらく前にRリストにこれを掲示し、R-バグリストのバグとして報告しました。私は何の役に立つの応答がなかったので、私はバグが再現性があったか、私は何かが欠けたかどうかを確認するためにtwitted。 JDロングはそれを再現することができましたし、親切にここに質問を投稿しました。
それがないので、grepのは「正規表現と印刷のためのグローバル・サーチ」の略ながら、注意少なくともRに、そして、AGREPは誤称である、ことをはは、正規表現に一致しません。これは、ターゲットベクトルよりも長いパターンに問題があってはなりません。 (と思う!)
私の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、max.distance = 30) [1] 1
AGREP(パターン、X、max.distance = 31) 整数(0) AGREP(パターン、X、max.distance = 32) 整数(0) AGREP(パターン、X、max.distance = 33) [1] 1
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
AGREP(パターン、X、max.distance = 30) [1] 1 AGREP(パターン、X、max.distance = 31) [1] 1 AGREP(パターン、X、max.distance = 32) [1] 1 AGREP(パターン、X、max.distance = 33) [1] 1
他のヒント
私はあなたの例では、理にかなっているかどうかわからないです。基本は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>