funcion - regular expression using r
Reemplazar letras múltiples con acentos con gsub (10)
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"
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.
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"
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)
}
Puede usar el paquete stringi
para reemplazar estos caracteres.
> stri_trans_general(c("á","é","ó"), "latin-ascii")
[1] "a" "e" "o"
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.
Tal vez esto puede ser útil:
iconv(''áéóÁÉÓçã'', to="ASCII//TRANSLIT")
[1] "aeoAEOca"
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)
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"
Usa la función de traducción de caracteres
chartr("áéó", "aeo", mydata)