2016-06-01 4 views
0

J'ai un vecteur d'emplacements que j'essaie de désambiguïser contre un vecteur de noms d'emplacement corrects. Pour cet exemple, je suis en utilisant seulement deux endroits désambiguïsé THO:Comment faire correspondre une chaîne avec une tolérance d'un caractère?

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

La page d'aide est dit que max.distance

distance maximale autorisée pour un match. Exprimé en entier ou en fraction de la longueur du motif multiplié par le coût maximal de la transformation

Je ne suis pas certain de la signification mathématique de la distance de Levensthein; ma compréhension est que plus la distance est petite, plus la tolérance pour les discordances avec mon vecteur de chaînes désambiguïsées est stricte.

Donc, je voudrais l'ajuster pour récupérer deux FALSE? En fait, je voudrais avoir une TRUE seulement quand il y a une différence de 1 caractère comme dans:

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

Essayez 'adist' à la place. Le problème est que vous avez des correspondances partielles, alors 'Au' correspond immédiatement à' * Au * stin'. Par exemple, 'adist (c (" Au "," Austn, TX "), c (" Austin, TX "," Houston, TX "), partiel = FALSE)' – thelatemail

+0

Si vous passez 'max.distance' un entier , il l'utilise comme le nombre de changements autorisés au lieu de la proportion. Vous pouvez également lui transmettre une liste de limites nommées pour des types particuliers de modifications, par ex. 'agrepl ('Au', c ('Austin, TX', 'Houston, TX'), max.distance = c (coûts = 1, insertions = 0, suppressions = 1, substitutions = 0), ignore.case = T , fixé = T) '. Voir '? Agrep' pour plus d'informations. – alistaire

+0

@thelatemail Merci, dois-je écrire une fonction pour saisir la chaîne avec la plus petite différence ou existe-t-il un moyen spécifique de récupérer les valeurs plutôt que des distances basées sur un seuil personnalisé? @ alistaire C'est ce que je pensais, mais si vous vérifiez, vous verrez que "Au" correspond "Austin, TX", ce que je ne veux pas. – Dambo

Répondre

1

Le problème que vous rencontrez est peut-être semblable à celui que je fait face au démarrage de l'expérimenter ici à. Le premier argument est un motif regex lorsque fixed = TRUE, de sorte que les petits motifs sont très permissifs s'ils ne sont pas forcés à être la chaîne complète. La page d'aide a même un « billet » à propos de cette question:

Depuis quelqu'un qui a lu la description négligemment même déposé un rapport de bogue sur elle, ne notez que cela correspond à des sous-chaînes de chaque élément de x (comme grep-t) et non des éléments entiers.

En utilisant les modèles regex vous faites cela en encadrant la chaîne pattern par «^» et « $ », puisque, contrairement adist, agrepl n'a pas de paramètre partiel:

> 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 

Vous devez paste0 avec les flankers:

> 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 

est peut-être préférable d'utiliser all plutôt que insertions, et vous voudrez peut-être réduire la fraction.