В 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-справке некоторые ключевые термины.
В пакете 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)