Detección de patrones en R con grepl() y grep()
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.