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

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

Спасибо!

5 ответов

Решение

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

Тем не мение, agrep должен сделать трюк:

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

РЕДАКТИРОВАТЬ:

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

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

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

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

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

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

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

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

В пакете 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 

Пример 1a) регулярное выражение perl/linux: 's/oldstring/newstring/'

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

пример 2a) регулярное выражение perl/linux: 's/oldstring//'

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

Другие вопросы по тегам