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