2016-06-01 25 views
0

私は正しい位置名のベクトルに対して明確にしようとしている場所のベクトルを持っています。私はカントーちょうど2つの明確化の場所を使用しています。この例 :1文字の許容値と文字列を一致させる方法は?

agrepl('Au', c("Austin, TX", "Houston, TX"), 
max.distance = .000000001, 
ignore.case = T, fixed = T) 
[1] TRUE TRUE 

ヘルプページはmax.distanceが試合に許さ

の最大距離であることを述べています。表現のいずれかの整数として、またはパターン長時間の割合として最大の変換は

私はLevensthein距離の数学的意味についてわからない費用。私の理解は距離が小さいほど、曖昧さのない文字列のベクトルとのミスマッチに対する許容範囲が厳しくなります。

だから私は2つを取得するように調整するでしょうFALSE

agrepl('Austn, TX', "Austin, TX", 
max.distance = .000000001, ignore.case = T, fixed = T) 
[1] TRUE 
+0

代わりに 'adist'を試してください。問題は部分一致が発生しているため、 'Au'は' * Au * stin'とすぐに一致します。例えば、 'adist(c(" Au "、" Austin、TX ")、c(" Austin、TX "、" Houston、TX ")、partial = FALSE)' – thelatemail

+0

'max.distance'を整数それは、比率の代わりに許される変更の数としてそれを使用します。また、特定のタイプの変更に対して名前付きの制限リストを渡すこともできます。 (コスト= 1、挿入数= 0、削除数= 1、置換数= 0)、ignore.case = T(コストは1、挿入数は0、 、fixed = T) 'である。詳細は '?agrep'を参照してください。 – alistaire

+0

@thelatemailありがとう、私は最小の差で文字列をつかむ関数を書くか、またはカスタムのしきい値に基づいて距離ではなく値を取得する特定の方法はありますか? @ alistaireそれは私が思ったことですが、もしあなたが "Au"が "Austin、TX"とマッチしているのを見たら、私は望みません。 – Dambo

答えて

1

あなたが持っている問題は、ここで実験し始めたときに私が直面しているものと、おそらく似ている:のように1文字の差がある場合にのみ、基本的に私はTRUEを持っていると思います。最初の引数は、fixed = TRUEの正規表現パターンなので、完全な文字列に制限されていないと、小さなパターンは非常に許容されます。 (grepのと同じような説明を読んで、誰かが不用意にもそれにバグレポートを提出しているので、

これは、xの各要素の部分文字列と一致していることに注意ください:ヘルプページでもその問題について「注意」を持っています)、要素全体ではない。

> agrepl('^Au$', "Austin, TX", 
+ max.distance = c(insertions=.15), ignore.case = T, fixed=FALSE) 
[1] FALSE 
> agrepl('^Austn, TX$', "Austin, TX", 
+ max.distance = c(insertions=.15), ignore.case = T, fixed=FALSE) 
[1] TRUE 
> agrepl('^Austn, T$', "Austin, TX", 
+ max.distance = c(insertions=.15), ignore.case = T, fixed=FALSE) 
[1] FALSE 

あなたがそれらとpaste0する必要があります:adistとは異なり、agreplは、部分的なパラメータを持っていないので、「^」と「$」でpattern文字列に隣接することで、あなたがこれを行う正規表現パターンを使用して

フランカー:

> agrepl(paste0('^', 'Austn, Tx', '$'), "Austin, TX", 
+ max.distance = c(insertions=.15), ignore.case = T, fixed=FALSE) 
[1] TRUE 
> agrepl(paste0('^', 'Au', '$'), "Austin, TX", 
+ max.distance = c(insertions=.15), ignore.case = T, fixed=FALSE) 
[1] FALSE 

ではなく、単にinsertionsよりもallを使用する方がよいかもしれません、あなたは分数を下げることができます。

関連する問題