неожиданные результаты agrep (), связанные с max.distance в R - PullRequest
3 голосов
/ 26 июля 2009

РЕДАКТИРОВАТЬ: Эта ошибка была обнаружена в 32-разрядных версиях R была исправлена ​​в версии 2.9.2 R.


Это было написано мне @leoniedu сегодня иУ меня нет ответа для него, поэтому я решил опубликовать его здесь.

Я прочитал документацию по agrep () (нечеткое сопоставление строк), и кажется, что я не полностью понимаю параметр max.distance. Вот пример:

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

Это ведет себя так, как я ожидал. Между строками 18 символов, поэтому я ожидаю, что это будет порог совпадения. Вот что меня смущает:

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

Почему 30 и 33 совпадения, а не 31 и 32? Чтобы сэкономить на счетах,

> nchar("Staatssekretar im Bundeskanzleramt")
[1] 34
> nchar("Bundeskanzleramt")
[1] 16

Ответы [ 2 ]

2 голосов
/ 26 июля 2009

Некоторое время назад я опубликовал это в списке R и сообщил об ошибке в R-bugs-list. У меня не было никаких полезных ответов, поэтому я попытался выяснить, была ли ошибка воспроизводимой или я что-то упустил. JD Long смог воспроизвести его и любезно разместил вопрос здесь.

Обратите внимание, что, по крайней мере в R, agrep является неправильным, поскольку он не соответствует регулярным выражениям, а grepрасшифровывается как «Глобальный поиск регулярного выражения и печати». У него не должно быть проблем с шаблонами длиннее, чем целевой вектор. (я думаю!)

На моем Linux-сервере все хорошо, но не так на компьютерах Mac и Windows.

Mac: sessionInfo () R версия 2.9.1 (2009-06-26) языковой стандарт i386-apple-darwin8.11.1: en_US.UTF-8 / en_US.UTF-8 / C / C / en_US.UTF-8 / en_US.UTF-8

agrep (шаблон, x,max.distance = 30) [1] 1

agrep (шаблон, x, max.distance = 31) целое число (0) agrep (шаблон, x, max.distance = 32) целое число (0) agrep (pattern, x, max.distance = 33) [1] 1

Linux: версия R 2.9.1 (2009-06-26) x86_64-unknown-linux-gnu

языковой стандарт: 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. -8; LC_NAME = C; LC_ADDRESS = C; LC_TELEPHONE = C; LC_MEASUREMENT = en_US.UTF-8; LC_IDENTIFICATION = C

agrep (шаблон, x, max.distance = 30) [1]1 agrep (шаблон, x, max.distance = 31) [1] 1 agrep (шаблон, x, max.distance = 32) [1] 1 agrep (шаблон, x, max.distance = 33) [1] 1

0 голосов
/ 26 июля 2009

Я не уверен, имеет ли ваш пример смысл. Для базового grep () pattern - это часто простое или регулярное выражение, а x - это вектор, элемент которого сопоставляется с pattern. Имея шаблон в виде более длинной строки, что x кажется мне странным.

Рассмотрим это, когда мы просто используем grep вместо 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>  
...