regular - Reemplazar caracteres usando gsub, ¿cómo crear una función?
regular expression in r (3)
Puedes crear from
y to
vectores:
from <- c(''a'',''b'',''c'',''d'',''e'',''f'')
to <- c(''h'',''i'',''j'',''k'',''l'',''m'')
y luego vectorializar la función gsub
:
gsub2 <- function(pattern, replacement, x, ...) {
for(i in 1:length(pattern))
x <- gsub(pattern[i], replacement[i], x, ...)
x
}
Lo que da:
> df <- data.frame(var1 = c("aabbcdefg", "aabbcdefg"))
> df$var1 <- gsub2(from, to, df$var1)
> df
var1
1 hhiijklmg
2 hhiijklmg
Estoy tratando de reemplazar los caracteres en un data.frame. Tengo una solución para esto.
> df <- data.frame(var1 = c("aabbcdefg", "aabbcdefg"))
> df
var1
1 aabbcdefg
2 aabbcdefg
> df$var1 <- gsub("a", "h", df$var1)
> df$var1 <- gsub("b", "i", df$var1)
> df$var1 <- gsub("c", "j", df$var1)
> df$var1 <- gsub("d", "k", df$var1)
> df$var1 <- gsub("e", "l", df$var1)
> df$var1 <- gsub("f", "m", df$var1)
> df
var1
1 hhiijklmg
2 hhiijklmg
>
pero me gustaría evitar el uso de varias llamadas a gsub, ¿sería mejor crear una función para hacer esto a la vez?
¿Alguna idea de cómo proceder?
Quieres chartr
df$var1 <- chartr("abcdef", "hijklm", df$var1)
df
# var1
# 1 hhiijklmg
# 2 hhiijklmg
Si no desea usar chartr porque las sustituciones pueden ser más de un carácter, entonces otra opción es usar gsubfn del paquete gsubfn (sé que esto no es gsub, pero es una expansión en gsub). Aquí hay un ejemplo:
> library(gsubfn)
> tmp <- list(a=''apple'',b=''banana'',c=''cherry'')
> gsubfn(''.'', tmp, ''a.b.c.d'')
[1] "apple.banana.cherry.d"
El reemplazo también puede ser una función que tomaría la coincidencia y devolvería el valor de reemplazo para esa coincidencia.