Pregunta

EDIT:. Este error se encuentra en versiones de 32 bits de R se fijó en R versión 2.9.2


Esto fue twitteado a mí por @leoniedu hoy y no tengo una respuesta para él, así que pensé que iba a publicar aquí.

He leído la documentación de agrep () (la coincidencia de cadenas difusa) y parece que no entiendo plenamente el parámetro Max.distance. He aquí un ejemplo:

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

que se comporta exactamente igual que yo esperaría. Hay 18 personajes diferentes entre las cuerdas por lo que sería de esperar que para ser el umbral de un partido. Esto es lo que me está confundiendo:

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

¿Por qué son 30 y 33 partidos, pero no 31 y 32? Para ahorrar algo de conteo,

> nchar("Staatssekretar im Bundeskanzleramt")
[1] 34
> nchar("Bundeskanzleramt")
[1] 16
¿Fue útil?

Solución

he publicado esto en la lista R hace un tiempo y se expresa como un error en I-bugs-lista. No tenía respuestas útiles, por lo que Twitted para ver si el error es reproducible o sólo estaba perdiendo algo. JD Long fue capaz de reproducirla y amablemente publicó la pregunta aquí.

Tenga en cuenta que, al menos en R, entonces, agrep es un nombre inapropiado, ya que hace no coincide con las expresiones regulares, mientras que grep significa "A nivel mundial la búsqueda de la expresión regular e imprimir". No debe tener un problema con los patrones más largo que el vector objetivo. (Creo!)

En mi servidor Linux, todo está bien, pero no así en mis máquinas Mac y Windows.

Mac: sessionInfo () R versión 2.9.1 (2009-06-26) i386-manzana-darwin8.11.1 lugar: en_US.UTF-8 / en_US.UTF-8 / C / C / en_US.UTF-8 / en_US.UTF-8

agrep (patrón, x, Max.distance = 30) [1] 1

  

agrep (patrón, x, Max.distance = 31)   número entero (0)   agrep (patrón, x, Max.distance = 32)   número entero (0)   agrep (patrón, x, Max.distance = 33)   [1] 1

Linux: R versión 2.9.1 (2009-06-26) 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 (patrón, x, Max.distance = 30)   [1] 1   agrep (patrón, x, Max.distance = 31)   [1] 1   agrep (patrón, x, Max.distance = 32)   [1] 1   agrep (patrón, x, Max.distance = 33)   [1] 1

Otros consejos

No estoy seguro de si su ejemplo tiene sentido. Para el grep básica (), modelo es a menudo una simple o una expresión regular, y x es un vector cuyo elemento conseguir emparejado al patrón. Teniendo como patrón de cadena más larga que X me parece extraño.

Considere esto cuando nos limitamos a usar grep en vez de la subcadena:

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>  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top