Заменить несколько букв с акцентами с gsub
конечно, я мог бы заменить конкретные аргументы, как это:
mydata=c("á","é","ó")
mydata=gsub("á","a",mydata)
mydata=gsub("é","e",mydata)
mydata=gsub("ó","o",mydata)
mydata
но, конечно, есть более простой способ сделать это все в онле линии, не так ли? Я не считаю, что помощь gsub очень всеобъемлюща по этому вопросу.
10 ответов:
интересный вопрос! Я думаю, что самый простой вариант-разработать специальную функцию, что-то вроде "multi" gsub():
mgsub <- function(pattern, replacement, x, ...) { if (length(pattern)!=length(replacement)) { stop("pattern and replacement do not have the same length.") } result <- x for (i in 1:length(pattern)) { result <- gsub(pattern[i], replacement[i], result, ...) } result }
что дает мне:
> mydata <- c("á","é","ó") > mgsub(c("á","é","ó"), c("a","e","o"), mydata) [1] "a" "e" "o"
можно использовать
stringi
пакет для замены этих символов.> stri_trans_general(c("á","é","ó"), "latin-ascii") [1] "a" "e" "o"
другое
mgsub
реализация с использованиемReduce
mystring = 'This is good' myrepl = list(c('o', 'a'), c('i', 'n')) mgsub2 <- function(myrepl, mystring){ gsub2 <- function(l, x){ do.call('gsub', list(x = x, pattern = l[1], replacement = l[2])) } Reduce(gsub2, myrepl, init = mystring, right = T) }
проблема с некоторыми реализациями выше (например, Теодора литры) заключается в том, что если шаблоны являются несколькими символами, они могут конфликтовать в случае, если один шаблон является подстрокой другого. Способ решить эту проблему-создать копию объекта и выполнить замену шаблона в этой копии. Это реализовано в моем пакете bayesbio, доступном на CRAN.
mgsub <- function(pattern, replacement, x, ...) { n = length(pattern) if (n != length(replacement)) { stop("pattern and replacement do not have the same length.") } result = x for (i in 1:n) { result[grep(pattern[i], x, ...)] = replacement[i] } return(result) }
вот тестовый пример:
asdf = c(4, 0, 1, 1, 3, 0, 2, 0, 1, 1) res = mgsub(c("0", "1", "2"), c("10", "11", "12"), asdf)
Это очень похоже на @kith, но в виде функции, и с наиболее распространенными диакритическими случаями:
removeDiscritics <- function(string) { chartr( "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ" ,"SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy" , string ) } removeDiscritics("test áéíóú")
"test aeiou"