Question

EDIT:. Ce bogue a été trouvé dans les versions 32 bits de R a été résolu dans la version R 2.9.2


Cela m'a été tweeté par @leoniedu aujourd'hui et je n'ai pas de réponse pour lui, donc je pensais que je posterais ici.

J'ai lu la documentation agrep () (correspondance de chaîne floue) et il semble que je ne comprends pas bien le paramètre max.distance. Voici un exemple:

pattern <- "Staatssekretar im Bundeskanzleramt"
x <- "Bundeskanzleramt"
agrep(pattern,x,max.distance=18) 
agrep(pattern,x,max.distance=19)

Ce se comporte exactement comme j'attendre. Il y a 18 caractères différents entre les cordes donc j'attends que ce soit le seuil d'un match. Voici ce qui me confondre:

agrep(pattern,x,max.distance=30) 
agrep(pattern,x,max.distance=31)
agrep(pattern,x,max.distance=32) 
agrep(pattern,x,max.distance=33)

Pourquoi 30 et 33 matches, mais pas 31 et 32? Pour vous faire gagner du comptage,

> nchar("Staatssekretar im Bundeskanzleramt")
[1] 34
> nchar("Bundeskanzleramt")
[1] 16
Était-ce utile?

La solution

Je posté sur la liste de R un certain temps et rapporté en tant que bogue dans les bogues R-liste. J'ai eu aucune réponse utile, donc je twitté pour voir si le bug était quelque chose reproductible ou je ne faisais que manque. JD Long a été en mesure de le reproduire et de bien vouloir posté la question ici.

Notez que, au moins en R, puis, agrep est un abus de langage, car il fait pas correspond à des expressions régulières, alors que grep signifie « Globalement la recherche de l'expression régulière et Imprimer ». Il ne devrait pas avoir un problème avec des motifs plus que le vecteur cible. (Je pense!)

Dans mon serveur linux, tout va bien, mais pas dans mes machines Mac et Windows.

Mac: sessionInfo () R Version 2.9.1 (26/06/2009) i386-pomme-darwin8.11.1 lieu: en_US.UTF-8 / en_US.UTF-8 / C / C / en_US.UTF-8/8-en_US.UTF

agrep (motif, x, max.distance = 30) [1] 1

  

agrep (motif, x, max.distance = 31)   entier (0)   agrep (motif, x, max.distance = 32)   entier (0)   agrep (motif, x, max.distance = 33)   [1] 1

Linux: R Version 2.9.1 (26/06/2009) x86_64-unknown-linux-gnu

locale

: 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 (motif, x, max.distance = 30)   [1] 1   agrep (motif, x, max.distance = 31)   [1] 1   agrep (motif, x, max.distance = 32)   [1] 1   agrep (motif, x, max.distance = 33)   [1] 1

Autres conseils

Je ne suis pas sûr que votre exemple est logique. Pour le grep de base (), le motif est souvent simple ou une expression régulière, et x est un vecteur dont l'élément adapté à se modèle. motif ayant comme chaîne plus longue que x me semble bizarre.

Considérez ceci où nous utilisons simplement grep au lieu de 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>  
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top