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

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

спасибо!

5 ответов


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

в любом случае,agrep следует сделать трюк:

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

EDIT:

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


вы можете настроить вектор всех возможных орфографических ошибок, а затем сделать цикл над вызовом 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


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


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