Подтвердить что ты не робот

В R, как заменить строку, содержащую определенный шаблон, с другой строкой?

Я работаю над проектом, включающим очистку списка данных по специальностям колледжа. Я считаю, что много ошибок написано, поэтому я искал функцию gsub(), чтобы заменить орфографические ошибки правильной орфографией. Например, скажем, "biolgy" ошибочно написана в списке майоров майора. Как я могу заставить R обнаружить орфографию и заменить ее правильной орфографией? Я пробовал gsub('biol', 'Biology', Major), но это только заменяет первые четыре буквы в "biolgy". Если я делаю gsub('biolgy', 'Biology', Major), он работает только для одного случая, но не обнаруживает других форм орфографии "биологии".

Спасибо!

4b9b3361

Ответ 1

Вы должны либо определить какое-то отличное регулярное выражение, либо использовать agrep из base. Пакет stringr - это еще один вариант, я знаю, что люди его используют, но я очень большой поклонник регулярных выражений, поэтому для меня это не-нет.

В любом случае agrep должен выполнить трюк:

agrep("biol", "biology")
[1] 1
agrep("biolgy", "biology")
[1] 1

EDIT:

Вы также должны использовать ignore.case = TRUE, но будьте готовы сделать некоторую бухгалтерию "вручную"...

Ответ 2

Вы можете настроить вектор всех возможных орфографических ошибок, а затем выполнить цикл над вызовом gsub. Что-то вроде:

biologySp = c("biolgy","biologee","bologee","bugs")

for(sp in biologySp){
  Major = gsub(sp,"Biology",Major)
}

Если вы хотите сделать что-то умнее, посмотрите, есть ли какие-либо пакеты с нечеткой совпадением на CRAN или что-то, что использует "soundex".

Страница википедии ок. может быть полезно сопоставление строк, и попробуйте найти R-help для некоторых ключевых терминов.

http://en.wikipedia.org/wiki/Approximate_string_matching

Ответ 3

Вы могли бы сначала сопоставить майоры с списком доступных майоров, и любое несоответствие было бы вероятным пропуском. Затем используйте функцию agrep для повторного сопоставления с известными специалистами (agrep делает приблизительное соответствие, поэтому, если оно похоже на правильное значение, вы получите совпадение).

Ответ 4

В пакете vwr есть методы для сопоставления строк:

http://ftp.heanet.ie/mirrors/cran.r-project.org/web/packages/vwr/index.html

поэтому лучше всего использовать строку с минимальным расстоянием Левенштейна от возможных сюжетных строк:

> levenshtein.distance("physcs",c("biology","physics","geography"))
  biology   physics geography 
        7         1         9 

Если вы получите одинаковые минимумы, то переверните монету:

> levenshtein.distance("biolsics",c("biology","physics","geography"))
  biology   physics geography 
        4         4         8 

Ответ 5

пример 1a) perl/linux regex: 's/oldstring/newstring/'

пример 1b) R эквивалент 1a: srcstring=sub(oldstring, newstring, srcstring)

пример 2a) perl/linux regex: 's/oldstring//'

пример 2b) R эквивалент 2a: srcstring=sub(oldstring, "", srcstring)