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

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

Спасибо!

Ответы [ 5 ]

13 голосов
/ 14 марта 2011

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

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

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

EDIT:

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

2 голосов
/ 14 марта 2011

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

2 голосов
/ 14 марта 2011

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

0 голосов
/ 16 ноября 2014

пример 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)

0 голосов
/ 15 марта 2011

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