Reemplazar patrones en R con gsub() y sub()

Manipulación de datos con R Manipulación de texto
Reemplazar patrones en R

En R se pueden sustituir patrones en cadenas de texto con las funciones gsub y sub. En este tutorial aprenderás las diferencias entre estas funciones y cómo eliminar o reemplazar los patrones a través de ejemplos explicando los casos de uso más comunes.

Sintaxis y diferencias

La función gsub reemplaza todas las coincidencias de un patrón mientras que sub reemplaza la primera coincidencia de un patrón. La sintaxis básica de las funciones es la misma, ya que necesitarás introducir el patrón (pattern), el texto de reemplazo (replacement) que quieras y la cadena de caracteres original (x).

# Reemplazar TODAS las coincidencias de un patrón
gsub(pattern, replacement, x)

# Reemplazar LA PRIMERA coincidencia de un patrón
sub(pattern, replacement, x)

Además, estas funciones proporcionan otros argumentos denominados ignore.case, perl, fixed, useBytes e invert. Recuerda escribir ?gsub o ?sub para leer la documentación oficial de estas funciones y obtener más información.

La función gsub

Considera que tienes una cadena de texto y quieres sustituir la palabra “azul” por la palabra “roja” en todas las ocurrencias. Para ello puedes utilizar la función gsub como en el ejemplo siguiente.

x <- "La chaqueta era azul"

gsub(pattern = "azul", replacement = "roja", x = x)
"La chaqueta era roja"

Como ya se ha dicho, si hay varias coincidencias, se sustituirán todas.

x <- "La chaqueta era azul y la camisa también era azul"

gsub("azul", "roja", x)
"La chaqueta era roja y la camisa también era roja"

También puedes introducir un vector de caracteres para reemplazar las posibles coincidencias dentro de cada elemento del vector.

x <- c("rojo", "azul", "amarilo", "azul")

gsub("azul", "verde", x)
"rojo"    "verde"   "amarilo" "verde"

Ten en cuenta que por defecto, la coincidencia de patrones distingue entre mayúsculas y minúsculas, por lo que si quieres ignorar mayúsculas y minúsculas establece ignore.case = TRUE.

x <- "La chaqueta era azul"

gsub("CHAQUETA", "camisa", x, ignore.case = TRUE)
"La camisa era azul"

Las posibilidades de esta función son enormes, por lo que en las siguientes subsecciones vamos a repasar algunos de los casos de uso más comunes.

Reemplazar comillas

Puedes sustituir las comillas dobles por simples o eliminarlas. Para ello, si quieres sustituir por comillas simples deberás utilizar '"' como patrón y "'" como reemplazo y si quieres sustituir por comillas dobles deberás utilizar "'" como patrón y '"' como reemplazo.

x <- 'Yo le dije: "me parece bien"'

# Comillas dobles por simples
gsub('"', "'", x)

# Comillas simples por dobles
# gsub("'", '"', x)
"Yo le dije: 'me parece bien'"

Reemplazar espacios

Es posible sustituir o eliminar espacios utilizando " " como patrón.

x <- 'Nombre Juan'

gsub(" ", ": ", x)
"Nombre: Juan"

Reemplazar barras invertidas (backslash)

Si quieres sustituir la barra invertida no puedes introducirla directamente, sino que tendrás que utilizar "\\\\". En el siguiente ejemplo reemplazamos todas las barras invertidas por barras.

x <- "E:\\Documentos\\"

gsub("\\\\", "/", x)
"E:/Documentos/"

Reemplazar puntos

Si pasas un único punto a pattern, todo el texto se sustituirá. En caso de que quieras reemplazar los puntos, deberás agregar dos barras invertidas antes del punto o usar fixed = TRUE, como se muestra en el siguiente ejemplo.

x <- "Este es un texto con punto final."

gsub("\\.", "", x)

# Equivalente a:
# gsub(".", "", x, fixed = TRUE)
"Este es un texto con punto final"

Eliminar paréntesis

Para eliminar paréntesis deberás introducir "\\(|\\)" como patrón. El patrón para los corchetes es "\\[|\\]".

x <- "(Texto dentro de paréntesis)"

gsub("\\(|\\)", "", x)

# Para corchetes:
# gsub("\\[|\\]", "", x)
"Texto dentro de paréntesis"

Eliminar números

El patrón pasado a gsub también puede aceptar expresiones regulares. La siguiente expresión regular ("[0-9]+") puede utilizarse para detectar cualquier número.

x <- "12Texto52"

gsub("[0-9]+", "", x)
"Texto"

Ten en cuenta que si estableces fixed = TRUE la función ignorará la expresión regular y utilizará la cadena de texto del patrón tal cual.

x <- "[0-9]+12Texto52"

gsub("[0-9]+", "", x, fixed = TRUE)
"12Texto52"

Reemplazar varios patrones

Es posible reemplazar múltiples patrones con la función gsub si separas cada patrón con | sin espacios. En el siguiente ejemplo la letra “a” o la letra “b” serán reemplazadas por la letra “c”.

gsub("a|b", "c", "ab")
"cc"

Eliminar o reemplazar todo después de una cadena de texto

A veces es necesario eliminar o sustituir todo lo que aparece después de una cadena de texto. Con [x].* podrás detectar todo después de [x], incluyendo [x].

x <- "Eliminar texto después de aquí: texto a eliminar"

gsub(" aquí.*", "", x)
"Eliminar texto después de"

Eliminar o reemplazar todo antes de una cadena de texto

Lo contrario de lo anterior es eliminar o sustituir todo lo que precede a una coincidencia. Para ello puedes utilizar .*[x] para detectar todo lo anterior a [x], incluyendo [x].

x <- "Eliminar texto antes de aquí: texto a mantener"

gsub(".*aquí: ", "", x)
"texto a mantener"

La función sub

Como ya se ha dicho, la función sub es equivalente a gsub pero sólo sustituirá la primera aparición del patrón de entrada. Considera el siguiente ejemplo, en el que el patrón aparece dos veces pero sólo se sustituye la primera aparición.

x <- "rojo verde azul rojo"

sub("rojo", "amarillo", x)
"amarillo verde azul rojo"

Lo mismo ocurre cuando se utilizan expresiones regulares. En el ejemplo siguiente sólo se elimina la primera coincidencia.

x <- "12Text52"

sub("[0-9]+", "", x)
"Text52"