Pergunta

EDIT:. Este bug foi encontrado em versões de R 32 bits foi fixado em R versão 2.9.2


Este foi twittou a mim por @leoniedu hoje e eu não tenho uma resposta para ele, então eu pensei que eu iria postá-lo aqui.

Eu li a documentação para agrep () (strings difusa) e parece que eu não compreender totalmente o parâmetro max.distance. Aqui está um exemplo:

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

que se comporta exatamente como eu poderia esperar. Há 18 personagens diferentes entre as cordas para que eu esperaria que ser o limiar de um jogo. Aqui é o que está me confundindo:

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 que são 30 e 33 partidas, mas não 31 e 32? Para poupar algum contagem,

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

Solução

Eu postei isso na lista R um tempo atrás e relatado como um bug no R-bugs-lista. Eu não tinha respostas úteis, então eu twitted para ver se o bug foi reprodutível ou eu só estava faltando alguma coisa. JD Longo foi capaz de reproduzi-lo e gentilmente postou a pergunta aqui.

Note-se que, pelo menos em R, então, agrep é um equívoco, uma vez que faz não corresponde expressões regulares, enquanto grep significa "busca Globalmente para a expressão regular e Imprimir". Ele não deve ter um problema com padrões mais longos do que o vector alvo. (Eu acho!)

No meu servidor linux, tudo está bem, mas não tão em minhas máquinas Mac e Windows.

Mac: sessionInfo () R versão 2.9.1 (2009-06-26) i386-maçã-darwin8.11.1 localidade: en_US.UTF-8 / en_US.UTF-8 / C / C / en_US.UTF-8 / en_US.UTF-8

agrep (padrão, x, max.distance = 30) [1] 1

agrep (padrão, x, max.distance = 31) inteiro (0) agrep (padrão, x, max.distance = 32) inteiro (0) agrep (padrão, x, max.distance = 33) [1] 1

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

Outras dicas

Eu não tenho certeza se o seu exemplo faz sentido. Para o grep básica (), padrão é muitas vezes uma simples ou uma expressão regular, e x é um vetor cujo elemento se combinado com o padrão. Tendo padrão como mais cadeia que x me parece estranho.

Considere isto onde nós apenas usar grep em vez 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>  
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top