неожиданные результаты agrep(), связанные с максимальным расстоянием в R

StackOverflow https://stackoverflow.com/questions/1182932

  •  19-09-2019
  •  | 
  •  

Вопрос

Редактировать: Эта ошибка, обнаруженная в 32-разрядных версиях R, была исправлена в R версии 2.9.2.


Это написал мне сегодня в твиттере @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
Это было полезно?

Решение

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

Обратите внимание, что, по крайней мере, в 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, максимальноерасстояние =30) [1] 1

agrep (шаблон, x, максимальное расстояние = 31) целое число (0) agrep (шаблон, x, максимальное расстояние = 32) целое число (0) agrep(шаблон, x, максимальноерасстояние=33) [1] 1

Linux:R версия 2.9.1 (2009-06-26) x86_64-неизвестно-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.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C

agrep(шаблон,x,максимальное расстояние = 30) [1] 1 agrep (шаблон,x, максимальноерасстояние = 31) [1] 1 agrep (шаблон, x,максимальноерасстояние = 32) [1] 1 agrep (шаблон,x, максимальноерасстояние = 33) [1] 1

Другие советы

Я не уверен, имеет ли смысл ваш пример.Для базового grep() шаблон часто является простым или регулярным выражением, а x - это вектор, элемент которого сопоставляется шаблону.Наличие шаблона в виде более длинной строки, чем 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>  
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top