Introducción

Manejar caracteres o cadenas de texto en R, aunque parece complicado, solo requiere de práctica y comprensión sobre la paquetería y comandos que son necesarios. En esta oportunidad, creé un ejemplo sencillo que demuestra cómo pueden utilizarse estos comandos y qué acciones pueden realizarse en aquellas bases de datos que manejan texto en sus observaciones. Suponga que se quiere armar una base de datos con la dirección física de cinco cafeterías en la ciudad de México. Esta base de datos debe tener las siguientes variables o categorías: Calle, Número exterior, Código Postal y Ciudad. Sin embargo, al momento de capturar los datos, la persona anotó toda la información en un mismo campo como puede observarse a continuación:

print(Direcciones)
## # A tibble: 5 x 2
##   Sucursal Dirección                                           
##      <dbl> <chr>                                               
## 1        1 Av. Benjamín Franklin 37, 06170, Ciudad de México   
## 2        2 Av. Michoacán 139, 06140, Ciudad de México          
## 3        3 Av. Tamaulipas 55, 06140, Ciudad de México          
## 4        4 Durango 205, 06700, Ciudad de México                
## 5        5 Av. Paseo de la reforma 325, 06600, Ciudad de México

En la columna Dirección, está toda la información que originalmente queríamos que estuviera en cuatro campos distintos. ¿Cómo puede solucionarse este problema y qué comandos utilizar?

Algunos conceptos básicos

Para solucionar este problema debemos utilizar comandos que trabajen con strings o cadenas de texto. Para trabajar con estos comandos necesitamos dos paqueterías: rebus y stringr. Los comandos de estas dos paqueterías funcionan mediante patrones que cualquier analista debe definir previamente. Esto quiere decir que estos comandos requieren que nosotros les demos información sobre qué cosas específicas queremos identificar en una cadena de texto. Estos patrones pueden ser cosas muy básicas, como una palabra, o cosas más complejas, como una expresión regular. Una expresión regular conforma una secuencia de caracteres por medio de símbolos preestablecidos que definen un patrón.

Aquí, vale la pena mencionar lo que un colega nos presentó en una clase de expresiones regulares. “Las regex son conceptos complicados (incluso para los programadores), así que tómenlo con calma”.

Rebus

La paquetería rebus nos permite construir expresiones regulares que posteriormente conformarán nuestros patrones. A lo largo de este tutorial utilizaremos varios patrones que utilizan rebus como fundamento.

Rebus utiliza un comando muy útil que sirve como enlace o para concatenar un comando y otro. Este comando se debe escribir dígito por dígito de esta forma: %R%.

Stringr

Esta paquetería está conformada por comandos muy específicos para trabajar con cadenas de texto. La mayoría de los comandos de esta paquetería utilizan dos insumos: el string, que es la cadena de texto que queremos evaluar, y el patrón, que son los detalles específicos que queremos detectar en nuestro string.

Empecemos

Lo primero que tenemos que hacer es instalar y cargar estas paqueterías. Luego, en la base de datos ‘Direcciones’, la primera cosa que podemos detectar y qué será fácil de separar es la ciudad donde están las cafeterías. Por lo tanto, la frase ‘Ciudad de México’ será nuestro primer patrón.

patron1 <- "Ciudad de México"
str_view(Direcciones$Dirección, patron1)

El comando str_view() pertenece a la paquetería stringr. Pueden notar que la primera entrada del comando es el string que queremos evaluar (La columna Dirección de la base Direcciones: Direcciones$Dirección) y la segunda entrada del comando es el patrón que queremos que evalúe (patron1). El output de este comando nos muestra en el visualizador ambas entradas: la cadena de texto y el patrón resaltado.

Una vez que hemos identificado este patrón, podemos extraerlo de la cadena de texto y colocarlo en una columna diferente que llamaremos ‘Ciudad’. Para esto, utilizaremos el comando str_extract() con las mismas entradas que hemos definido.

Direcciones$Ciudad <- str_extract(Direcciones$Dirección, patron1)
print(Direcciones)
## # A tibble: 5 x 3
##   Sucursal Dirección                                            Ciudad          
##      <dbl> <chr>                                                <chr>           
## 1        1 Av. Benjamín Franklin 37, 06170, Ciudad de México    Ciudad de México
## 2        2 Av. Michoacán 139, 06140, Ciudad de México           Ciudad de México
## 3        3 Av. Tamaulipas 55, 06140, Ciudad de México           Ciudad de México
## 4        4 Durango 205, 06700, Ciudad de México                 Ciudad de México
## 5        5 Av. Paseo de la reforma 325, 06600, Ciudad de México Ciudad de México

El segundo patrón que podemos identificar son los números exteriores que se encuentran como los primeros dígitos en cada dirección. Para esto, crearemos un patrón con el comando one_or_more() que, a su vez, requiere que le indiquemos una expresión regular, en este caso será DGT dado que son números. Básicamente, le estamos diciendo al comando que queremos que identifique el primer conjunto de dígitos en la cadena de texto. Si solo usamos la palabra DGT en nuestro patrón, solo identificará un número y no el conjunto de números. Si en vez de colocar one_or_more(DGT), colocan one_or_more(WRD), el comando resaltará la primera palabra.

patron2 <- one_or_more(DGT)
str_view(Direcciones$Dirección, patron2)
str_view(Direcciones$Dirección, DGT)

Ya identificado este patrón, podemos extraerlo de la cadena de texto y colocarlo en una columna diferente que llamaremos ‘Numero exterior’ de esta forma:

Direcciones$'Numero Exterior' <- str_extract(Direcciones$Dirección, patron2)
print(Direcciones)
## # A tibble: 5 x 4
##   Sucursal Dirección                              Ciudad        `Numero Exterio~
##      <dbl> <chr>                                  <chr>         <chr>           
## 1        1 Av. Benjamín Franklin 37, 06170, Ciud~ Ciudad de Mé~ 37              
## 2        2 Av. Michoacán 139, 06140, Ciudad de M~ Ciudad de Mé~ 139             
## 3        3 Av. Tamaulipas 55, 06140, Ciudad de M~ Ciudad de Mé~ 55              
## 4        4 Durango 205, 06700, Ciudad de México   Ciudad de Mé~ 205             
## 5        5 Av. Paseo de la reforma 325, 06600, C~ Ciudad de Mé~ 325

El tercer patrón identificable son los números del código postal. Para especificar este patrón, utilizaremos el comando enlace (concatenation) y otras formas de expresiones regulares. Nuevamente, ya podemos extraer este patrón específico de la cadena de texto y colocarlo en la columna ‘CP’.

patron3 <- "," %R% SPC %R% one_or_more(DGT)
str_view(Direcciones$Dirección, patron3)
Direcciones$CP <- str_extract(Direcciones$Dirección, patron3)
Direcciones$CP <-  str_replace(Direcciones$CP, ", ","")
print(Direcciones)
## # A tibble: 5 x 5
##   Sucursal Dirección                         Ciudad       `Numero Exterio~ CP   
##      <dbl> <chr>                             <chr>        <chr>            <chr>
## 1        1 Av. Benjamín Franklin 37, 06170,~ Ciudad de M~ 37               06170
## 2        2 Av. Michoacán 139, 06140, Ciudad~ Ciudad de M~ 139              06140
## 3        3 Av. Tamaulipas 55, 06140, Ciudad~ Ciudad de M~ 55               06140
## 4        4 Durango 205, 06700, Ciudad de Mé~ Ciudad de M~ 205              06700
## 5        5 Av. Paseo de la reforma 325, 066~ Ciudad de M~ 325              06600

En este último caso, es necesario destacar dos cosas:

Lo último que nos falta es la calle que está en la dirección. Este patrón es más complicado porque, en un caso, está compuesto por tres palabras; en otros casos, por dos, etc. Por lo que la propuesta que se tiene es depurar la información eliminando los patrones que ya hemos identificado previamente. Para esto, crearemos la columna ‘Calle’ y tomaremos las direcciones originales como base, reemplazamos el patrón 1 por el vacío. Luego, en esta misma columna ‘Calle’, reemplazaremos el patrón 2 por el vacío. Finalmente, en esta misma columna ‘Calle’, reemplazaremos el patrón 3 y los símbolos restantes por el vacío.

Direcciones$Calle <- str_replace(Direcciones$Dirección, patron1, "")
Direcciones$Calle <- str_replace(Direcciones$Calle, patron2, "")
Direcciones$Calle <- str_replace(Direcciones$Calle, patron3, "")
str_view(Direcciones$Calle, " ,")
Direcciones$Calle <- str_replace(Direcciones$Calle, " ,", "")
print(Direcciones)
## # A tibble: 5 x 6
##   Sucursal Dirección               Ciudad     `Numero Exterio~ CP    Calle      
##      <dbl> <chr>                   <chr>      <chr>            <chr> <chr>      
## 1        1 Av. Benjamín Franklin ~ Ciudad de~ 37               06170 "Av. Benja~
## 2        2 Av. Michoacán 139, 061~ Ciudad de~ 139              06140 "Av. Micho~
## 3        3 Av. Tamaulipas 55, 061~ Ciudad de~ 55               06140 "Av. Tamau~
## 4        4 Durango 205, 06700, Ci~ Ciudad de~ 205              06700 "Durango " 
## 5        5 Av. Paseo de la reform~ Ciudad de~ 325              06600 "Av. Paseo~

Este ejemplo solo fue una pequeña muestra de cómo utilizar comandos de expresiones regulares y trabajar con cadenas de texto. Como todo en R, los comandos que se requieran dependerán de la base de datos, de la información que se tenga en las cadenas de texto y de la información que se quiera extraer/revisar. Los comandos de expresiones regulares son muchos y hay un mundo entero todavía por conocer. Espero no haberlos(as) confundido mucho. Aquí, la invitación es a probar los comandos y las paqueterías de expresiones regulares para que se vayan familiarizando con las cosas pueden hacer.