Detección de patrones en R con grepl() y grep()

Manipulación de datos con R Manipulación de texto
Las funciones grepl() y grep() en R

Las funciones grepl y grep permiten buscar coincidencias de patrones dentro de un vector de caracteres. En este tutorial aprenderás sus diferencias y cómo utilizarlas en varios casos de uso.

Sintaxis y diferencias

Tanto grepl como grep buscan coincidencias de un patrón dentro de un vector de caracteres. La diferencia entre estas funciones es que grepl devuelve TRUE o FALSE dependiendo de si existe o no una coincidencia para el elemento correspondiente del vector mientras que grep devuelve los índices de los elementos del vector que coinciden con el patrón especificado.

La sintaxis básica de estas funciones es la misma:

# Devuelve TRUE/FALSE si el patrón se detecta o no en los elementos de X
grepl(pattern, x)

# Devuelve el índice de los elementos que cumplen el patrón
grep(pattern, x)

Estas funciones también proporcionan otros argumentos llamados ignore.case, perl, fixed, useBytes e invert y además, grepl proporciona un argumento llamado value. Si quieres obtener más información sobre ellos, escribe ?grepl o ?grep.

La función grepl

Considera que quieres comprobar si una cadena de texto contiene la letra “a”. Para ello puedes introducir "a" como patrón y la cadena o vector deseado en x (la palabra "arena" en este caso):

grepl(pattern = "a", x = "arena")
TRUE

El ejemplo anterior devuelve un TRUE porque hay una "a" dentro de "arena". Ten en cuenta que también puedes buscar coincidencias de cadenas de texto más largas:

grepl("na", "arena")
TRUE

La función es sensible a mayúsculas y minúsculas por defecto, por lo que si quieres buscar coincidencias con una mayúscula y la cadena de texto está en minúsculas o viceversa la función devolverá FALSE.

grepl("A", "arena")
FALSE

Si quieres ignorar este comportamiento, deberás establecer ignore.case = TRUE.

grepl("A", "arena", ignore.case = TRUE)
TRUE

Ten en cuenta que la función está diseñada para buscar patrones en vectores de caracteres, por lo que si introduces un vector en x la función devolverá un vector booleano de la misma longitud que x indicando si hubo coincidencia o no en el elemento correspondiente.

grepl("ar", c("arena", "mar", "tortuga"))
TRUE TRUE FALSE

Usando expresiones regulares

También puedes utilizar expresiones regulares para hacer coincidir cualquier cosa que quieras. El siguiente ejemplo se buscan los elementos del vector que contienen caracteres numéricos. Si quieres buscar con el patrón “tal cual” establece fixed = TRUE.

grepl("[0-9]", c("one", "2", "three3"))
FALSE  TRUE  TRUE

Varios patrones

Por último, si quieres buscar varios patrones puedes introducir los patrones deseados separados por | sin espacios. El ejemplo siguiente devolverá TRUE si el elemento correspondiente contiene la letra "n" o la letra "t".

# Busca "n" o "t"
grepl("n|t", c("arena", "mar", "tortuga"))
TRUE FALSE  TRUE

Es posible crear los patrones programáticamente pegando los diferentes patrones con las funciones paste() o paste0().

# Patrones elegidos
patterns <- c("ena", "ar", "w")
patterns <- paste0(patterns, collapse = "|") # "ena|ar|w"

# Búsqueda de coincidencias
grepl(patterns, c("arena", "mar", "tortuga"))
TRUE TRUE FALSE

La función grep

Si quieres conocer los índices de las coincidencias del patrón dentro del vector pasado a x puedes usar grep. En el siguiente ejemplo comprobamos si la cadena "El" está dentro de alguno de los elementos de x.

grep(pattern = "El", x = c("La arena", "El agua", "El cangrejo"))

# Equivalente a:
# which(grepl(pattern = "El", x = c("La arena", "El agua", "El cangrejo")) == TRUE)
2 3

La salida es 2 y 3 ya que la cadena "El" está dentro del segundo y tercer elemento del vector de caracteres.

Si no hay coincidencias, la función devolverá integer(0), como en el ejemplo siguiente.

grep(pattern = "x", x = c("La arena", "El agua", "El cangrejo"))
integer(0)

La función se comporta igual que grepl, por lo que también puedes buscar múltiples patrones separando cada uno con |.

grep(pattern = "La|cangrejo", x = c("La arena", "El agua", "El cangrejo"))
1 3

Si necesitas ignorar mayúsculas y minúsculas, también puedes establecer ignore.case = TRUE. Escribe ?grep para obtener más información sobre la función y sus argumentos.

grep(pattern = "b", x = c("A", "B", "C"), ignore.case = TRUE)
2

Por último, si estableces value = TRUE la función devolverá los elementos coincidentes de x con el patrón.

grep(pattern = "a", x = c("avión", "barco", "coche"), value = TRUE)
"avión" "barco"

R proporciona otras funciones para detectar patrones. Si quieres saber la posición inicial y la longitud de la coincidencia puedes usar regexpr, si quieres saber la posición de cada coincidencia puedes usar gregexpr. Consulta también las funciones regexec y gregexec para obtener resultados similares.