Reemplazar letras múltiples con acentos con gsub

por supuesto, podría reemplazar argumentos específicos como este:

mydata=c("á","é","ó") mydata=gsub("á","a",mydata) mydata=gsub("é","e",mydata) mydata=gsub("ó","o",mydata) mydata 

pero seguramente hay una forma más fácil de hacer esto todo en línea, ¿verdad? No encuentro que la ayuda de gsub sea muy completa en esto.

Usa la función de traducción de caracteres

 chartr("áéó", "aeo", mydata) 

Una pregunta interesante! Creo que la opción más simple es diseñar una función especial, algo así como un “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 } 

Lo que me da:

 > mydata <- c("á","é","ó") > mgsub(c("á","é","ó"), c("a","e","o"), mydata) [1] "a" "e" "o" 

Tal vez esto puede ser útil:

 iconv('áéóÁÉÓçã', to="ASCII//TRANSLIT") [1] "aeoAEOca" 

Puede usar el paquete stringi para reemplazar estos caracteres.

 > stri_trans_general(c("á","é","ó"), "latin-ascii") [1] "a" "e" "o" 

Otra implementación de mgsub usando 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) } 

Un problema con algunas de las implementaciones anteriores (por ejemplo, Theodore Lytras) es que si los patrones son múltiples caracteres, pueden entrar en conflicto en el caso de que un patrón sea una subcadena de otro. Una forma de resolver esto es crear una copia del objeto y realizar el reemplazo del patrón en esa copia. Esto se implementa en mi paquete bayesbio, disponible en 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) } 

Aquí hay un caso de prueba:

  asdf = c(4, 0, 1, 1, 3, 0, 2, 0, 1, 1) res = mgsub(c("0", "1", "2"), c("10", "11", "12"), asdf) 

Esto es muy similar a @kith, pero en forma de función, y con los casos de diacríticos más comunes:

 removeDiscritics <- function(string) { chartr( "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ" ,"SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy" , string ) } removeDiscritics("test áéíóú") 

"prueba aeiou"

No tan elegante, pero funciona y hace lo que quieres

 > diag(sapply(1:length(mydata), function(i, x, y) { + gsub(x[i],y[i], x=x) + }, x=mydata, y=c('a', 'b', 'c'))) [1] "a" "b" "c" 

Puedes usar la función de match . Aquí match(x, y) devuelve el índice de y donde el elemento de x coincide. Luego puede usar los índices devueltos, para subconjuntar otro vector (digamos z ) que contiene los reemplazos para los valores de x , apropiadamente emparejados con y . En tu caso:

 mydata <- c("á","é","ó") desired <- c('a', 'e', 'o') desired[match(mydata, mydata)] 

En un ejemplo más simple, considere la situación a continuación, donde estaba tratando de sustituir a 'alpha' , 'b' por 'beta' y así sucesivamente.

 x <- c('a', 'a', 'b', 'c', 'b', 'c', 'e', 'e', 'd') y <- c('a', 'b', 'c', 'd', 'e') z <- c('alpha', 'beta', 'gamma', 'delta', 'epsilon') z[match(x, y)] 

Relacionado con la respuesta de Justin:

 > m <- c("á"="a", "é"="e", "ó"="o") > m[mydata] á é ó "a" "e" "o" 

Y puede deshacerse de los nombres con names(*) <- NULL si lo desea.

    Intereting Posts