Domanda

EDIT:. Questo bug è stato trovato nelle versioni a 32 bit di R è stato fissato in R versione 2.9.2


Questo è stato un tweet a me da @leoniedu oggi e non ho una risposta per lui, così ho pensato di postare qui.

Ho letto la documentazione per agrep () (string matching sfocata) e sembra che non capisco pienamente il parametro max.distance. Ecco un esempio:

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

che si comporta esattamente come mi sarei aspettato. Ci sono 18 personaggi differenti tra le corde così mi aspetterei che per essere la soglia di una partita. Ecco cosa mi confonde:

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

Perché sono 30 e 33 le partite, ma non 31 e 32? Per risparmiare un po 'di conteggio,

> nchar("Staatssekretar im Bundeskanzleramt")
[1] 34
> nchar("Bundeskanzleramt")
[1] 16
È stato utile?

Soluzione

Ho postato questo sulla lista R un po 'indietro e segnalato come un bug in R-bug-list. Non ho avuto risposte utili, così ho twittato per vedere se il bug è riproducibile o stavo solo perdendo qualcosa. JD lungo è stato in grado di riprodurre e gentilmente pubblicato la domanda qui.

Si noti che, almeno in R, allora, agrep è un termine improprio in quanto non corrisponde espressioni regolari, mentre grep sta per "A livello globale cercare l'espressione regolare e stampa". Non dovrebbe avere un problema con i modelli più lunghi rispetto al vettore di destinazione. (Credo!)

Nel mio server Linux, tutto va bene, ma non così nelle mie macchine Mac e Windows.

Mac: sessionInfo () R versione 2.9.1 (2009-06-26) i386-apple-darwin8.11.1 locale: en_US.UTF-8 / en_US.UTF-8 / C / C / en_US.UTF-8 / en_US.UTF-8

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

  

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

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

Altri suggerimenti

Non sono sicuro se il vostro esempio ha un senso. Per il grep base (), modello è spesso un semplice o un'espressione regolare, ed x è un vettore il cui elemento ottenere abbinato al modello. Avendo motivo come stringa più lunga che x mi sembra strano.

Considerate questo in cui usiamo grep invece di 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>  
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top