В 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 для некоторых ключей условия.
вы можете сначала сопоставить майоры со списком доступных Майоров,любое несоответствие будет тогда вероятными ошибками. Затем используйте функцию 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)