PROCESAMIENTO DE DATOS

Ahora que ya sabemos abrir un dataset y conocer que información tiene, vamos a aprender a manipular, limpiar, normalizar y transformar los datos, o lo que se conoce como data wrangling. Para esto vamos a trabajar con uno de los paquetes más usados y más útiles de R que se llama tidyverse.

Pero, ¿Qué es un paquete?

Cuando instalamos R ya viene con múltiples funciones básicas para manipular datos, sin embargo el potencial de la herramienta surge con la posibilidad de incorporar constantemente nuevas funciones que nos permitan realizar nuevas tareas o mejorar el resultado de las ya existentes.

Estos grupos de funciones son a los que llamamos paquetes o packages y para poder utilizarlos es necesario instalarlos por única vez en la computadora, y luego activarlos cada vez que vayamos a usarlos.

Comencemos instalándolo. Esto podemos hacerlo manualmente en Tools/Install packages:

O directamente escribiendo install.packages() adentro de un chunk:

#install.packages("tidyverse")

Una vez que instalamos el paquete, no vamos a tener que volver a hacerlo. Solamente vamos a tener que “activarlo” cada vez que queramos usarlo. Esta activación se hace con library() así:

library(tidyverse)

Ahora volvamos a cargar el mismo dataset de la clase anterior y ajustemos el parámetro stringsAsFactors para estar seguros que los campos de tipo string sean tomados como factor:

suaci_202110 <- read.csv("data/suaci_202110.csv", stringsAsFactors = TRUE)

Revisemos nuevamente el resumen estadístico:

summary(suaci_202110)
##         contacto        periodo                                  categoria    
##  00441631/21:    1   Min.   :202110   LIMPIEZA Y RECOLECCIÓN          :18200  
##  00441632/21:    1   1st Qu.:202110   TRÁNSITO                        :16037  
##  00441633/21:    1   Median :202110   BARRIOS EMERGENTES              : 4275  
##  00441634/21:    1   Mean   :202110   CALLES Y VEREDAS                : 4233  
##  00441635/21:    1   3rd Qu.:202110   ARBOLADO Y ESPACIOS VERDES      : 2460  
##  00441636/21:    1   Max.   :202110   ORDENAMIENTO DEL ESPACIO PÚBLICO: 1422  
##  (Other)    :52920                    (Other)                         : 6299  
##                   subcategoria  
##  DENUNCIA VIAL          :14759  
##  RESIDUOS VOLUMINOSOS   :13216  
##  REPARACIÓN DE VEREDA   : 3342  
##  CESTOS Y CONTENEDORES  : 3063  
##  LIMPIEZA DE VÍA PÚBLICA: 1906  
##  DESAGOTE               : 1898  
##  (Other)                :14742  
##                                        prestacion     tipo_prestacion 
##  Vehículo mal estacionado                   :14475   Denuncia :17891  
##  Retiro de escombros / restos de obra       : 9592   Queja    : 2434  
##  Reparación de vereda                       : 2122   Reporte  :  940  
##  Retiro de restos de jardinería domiciliaria: 1985   Servicio :13249  
##  Desagote de pozo ciego (atmosférico)       : 1898   Solicitud:18412  
##  Desobstrucción (Vactor)                    : 1761                    
##  (Other)                                    :21093                    
##   domicilio_comuna      domicilio_barrio               canal      
##  Comuna 11: 5199   Palermo      : 4091   App BA 147       :18348  
##  Comuna 12: 4993   Flores       : 3030   GCS Web          :17584  
##  Comuna 13: 4849   Caballito    : 2865   App Denuncia Vial: 7740  
##  Comuna 15: 4315   Belgrano     : 2675   Boti             : 4429  
##  Comuna 14: 4067   Villa Urquiza: 2267   Operador UGIS    : 4274  
##  Comuna 7 : 3992   (Other)      :37196   Comuna           :  376  
##  (Other)  :25511   NA's         :  802   (Other)          :  175  
##        genero     
##           : 4274  
##  Femenino :21440  
##  Masculino:27164  
##  Otros    :   48  
##                   
##                   
## 

Tal como vimos la clase anterior, los datos incluidos en el dataset pertenecen al mes de octubre 2021, donde la comuna con mayor cantidad de registros fue la 11 con 5.199 y el barrio con mayor cantidad fue Palermo con 4.091.

A su vez, también podemos observar que la categoría que más se registró fue “Limpieza y recolección” (18.200) y la subcategoría “Denuncia vial” (14.759). Respecto a los usuarios, se registró que el género Masculino (27.164) fue predominante en los reclamos.

Ahora si, comencemos a utilizar el famoso paquete tidyverse que nos permitirá manipular nuestros datos a partir de las funciones: filtrar, modificar, seleccionar, ordenar, renombrar, resumir, agrupar y unir.

Cabe destacar que, aprender a utilizar todas estas funciones es muy importante ya que la comprensión, transformación y limpieza de los datos es la etapa que más tiempo nos llevará a la hora de encarar cualquier proyecto de Ciencia de Datos.

Filtrar registros según condiciones

Como su nombre lo indica, esta función hace referencia a realizar un filtro determinado sobre los registros/filas de toda la base de datos, es decir, quedarnos solo con las filas que cumplan cierta condición establecida. Gráficamente se vería como algo así:

Esto nos será muy útil si por algún motivo queremos dejar de lado registros y utilizar solo una parte de la base. Por ejemplo, en el caso de nuestro dataset, que ya vimos que incluye datos de las 15 Comunas de CABA, podríamos filtrar la data y quedarnos solo con los registros ubicados en la Comuna con mayor cantidad de contactos:

filtro <- filter(suaci_202110, domicilio_comuna=="Comuna 11")

dim(filtro)
## [1] 5199   10

Efectivamente, mi nuevo dataset tiene los mismos 5.199 registros que en el summary() anterior vimos que había en la Comuna 11. Ahora veamos el resumen estadístico de lo que pasó en la Comuna 11 durante octubre 2021:

summary(filtro)
##         contacto       periodo                                    categoria   
##  00441638/21:   1   Min.   :202110   LIMPIEZA Y RECOLECCIÓN            :2362  
##  00441650/21:   1   1st Qu.:202110   TRÁNSITO                          :1494  
##  00441659/21:   1   Median :202110   CALLES Y VEREDAS                  : 497  
##  00441672/21:   1   Mean   :202110   ARBOLADO Y ESPACIOS VERDES        : 335  
##  00441692/21:   1   3rd Qu.:202110   ALUMBRADO                         : 141  
##  00441733/21:   1   Max.   :202110   CONTROL EDILICIO, OBRAS Y CATASTRO:  87  
##  (Other)    :5193                    (Other)                           : 283  
##                                subcategoria 
##  RESIDUOS VOLUMINOSOS                :1628  
##  DENUNCIA VIAL                       :1344  
##  CESTOS Y CONTENEDORES               : 467  
##  REPARACIÓN DE VEREDA                : 398  
##  LIMPIEZA DE VÍA PÚBLICA             : 266  
##  PODA DE ÁRBOL Y DESPEJE DE LUMINARIA: 142  
##  (Other)                             : 954  
##                                                         prestacion  
##  Vehículo mal estacionado                                    :1307  
##  Retiro de escombros / restos de obra                        :1029  
##  Retiro de restos de jardinería domiciliaria                 : 387  
##  Reparación de vereda                                        : 244  
##  Retiro de residuos voluminosos (muebles y electrodomésticos): 212  
##  Poda de árbol/despeje de luminaria o semáforo               : 142  
##  (Other)                                                     :1878  
##   tipo_prestacion  domicilio_comuna          domicilio_barrio
##  Denuncia :1529   Comuna 11:5199    Villa Devoto     :2011   
##  Queja    : 265   Comuna 1 :   0    Villa Del Parque :1581   
##  Reporte  :  80   Comuna 10:   0    Villa Santa Rita : 896   
##  Servicio :1631   Comuna 12:   0    Villa Gral. Mitre: 707   
##  Solicitud:1694   Comuna 13:   0    Flores           :   2   
##                   Comuna 14:   0    Floresta         :   1   
##                   (Other)  :   0    (Other)          :   1   
##                canal            genero    
##  App BA 147       :2154            :   0  
##  GCS Web          :1768   Femenino :2472  
##  App Denuncia Vial: 703   Masculino:2726  
##  Boti             : 414   Otros    :   1  
##  Comuna           : 145                   
##  Mail 147         :  11                   
##  (Other)          :   4

Se puede ver que en la comuna 11, la categoría que más se registró fue la misma que para la Ciudad completa: “Limpieza y recolección”. Sin embargo, la subcategoría predominante fue “Residuos voluminosos”, cuando en la CABA completa era “Denuncia vial”.

Aprovechemos y hagamos un segundo filtro sobre los datos, por ejemplo dejemos solo los registros correspondientes a la categoría “Arbolado y espacios verdes” y veamos como se componen estos reclamos. Para esto reescribamos nuestro objeto comuna 11:

filtro <- filter(filtro, categoria=="ARBOLADO Y ESPACIOS VERDES")

dim(filtro)
## [1] 335  10

Ahora nos quedamos con los 335 registros correspondientes a la categoría por la que filtramos. Veamos el resumen estadístico:

summary(filtro)
##         contacto      periodo                                    categoria  
##  00441748/21:  1   Min.   :202110   ARBOLADO Y ESPACIOS VERDES        :335  
##  00442219/21:  1   1st Qu.:202110                                     :  0  
##  00442331/21:  1   Median :202110   ALUMBRADO                         :  0  
##  00442378/21:  1   Mean   :202110   BARRIOS EMERGENTES                :  0  
##  00442691/21:  1   3rd Qu.:202110   CALLES Y VEREDAS                  :  0  
##  00442716/21:  1   Max.   :202110   CONTROL EDILICIO, OBRAS Y CATASTRO:  0  
##  (Other)    :329                    (Other)                           :  0  
##                                   subcategoria
##  PODA DE ÁRBOL Y DESPEJE DE LUMINARIA   :142  
##  EXTRACCIÓN DE ÁRBOL                    : 78  
##  PROBLEMA CON INTERVENCIONES DE ARBOLADO: 71  
##  PLANTACIÓN DE ÁRBOL                    : 36  
##  PLAGAS / ENFERMEDADES EN ÁRBOL         :  7  
##  PARQUES Y PLAZAS                       :  1  
##  (Other)                                :  0  
##                                                       prestacion 
##  Poda de árbol/despeje de luminaria o semáforo             :142  
##  Extracción de árbol                                       : 78  
##  Problemas con intervenciones de arbolado                  : 64  
##  Plantación de árbol                                       : 36  
##  Árbol con enfermedades                                    :  7  
##  Falta de recolección de restos de poda de arbolado público:  7  
##  (Other)                                                   :  1  
##   tipo_prestacion  domicilio_comuna          domicilio_barrio
##  Denuncia :  0    Comuna 11:335     Villa Devoto     :154    
##  Queja    : 64    Comuna 1 :  0     Villa Del Parque : 87    
##  Reporte  :  7    Comuna 10:  0     Villa Santa Rita : 57    
##  Servicio :  0    Comuna 12:  0     Villa Gral. Mitre: 37    
##  Solicitud:264    Comuna 13:  0     Agronomia        :  0    
##                   Comuna 14:  0     Almagro          :  0    
##                   (Other)  :  0     (Other)          :  0    
##                canal           genero   
##  GCS Web          :148            :  0  
##  App BA 147       :145   Femenino :190  
##  Comuna           : 41   Masculino:145  
##  Mail 147         :  1   Otros    :  0  
##  App Denuncia Vial:  0                  
##  Boti             :  0                  
##  (Other)          :  0

Bien, ahora estamos viendo un universo aún más pequeño: Los reclamos de “Arbolado y espacios verdes” en la Comuna 11. Y en esta muestra, por ejemplo podemos ver que:

  • La subcategoría más denunciada fue “Poda de árbol y despeje de luminaria”.

  • El tipo de prestación más utilizada fue “Solicitud”.

  • El barrio de la Comuna 11 con más reclamos fue Villa Devoto.

  • La mayor cantidad de reclamos la hizo el género femenino.

Seguro notaron que en los 2 ejemplos anteriores, para filtrar bajo la condición de “igual” utilizamos “==”, pero ¡Hay muchas más posibilidades! Es decir que también podríamos haber utilizado otras condiciones como:

  • A==B -> A igual a B
  • A!=B -> A diferente a B
  • A<B -> A menor a B
  • A<=B -> A menor o igual a B
  • A>B -> A mayor a B
  • A>=B -> A mayor o igual a B
  • is.na(A) -> A tiene valor nulo (NA)
  • !is.na(A)-> A no tiene valor nulo (NA)
  • A%in%B -> A incluye el valor B
  • !(A%in%B)-> A no incluye el valor de B

Entonces, por ejemplo si quiero quedarme con todos los registros que no sean de la categoría Arbolado y espacios verdes debería escribirlo así:

filtro <- filter(suaci_202110, categoria != "ARBOLADO Y ESPACIOS VERDES")

dim(filtro)
## [1] 50466    10

En este caso, solo nos quedaron 50.466 observaciones ya que el resto (2.460) correspondía a “Arbolado y espacios verdes”.

Veamos otro caso, si por ejemplo queremos filtrar todos los reclamos ubicados en 3 barrios diferentes como por ejemplo Belgrano, Barracas y Villa del Parque debemos utilizar %in% de la siguiente forma:

filtro <- filter(suaci_202110, domicilio_barrio %in% c("Belgrano", "Barracas", "Villa Del Parque"))

dim(filtro)
## [1] 5829   10

Podemos ver que de los 52.926 reclamos de la base, solo hay 5.829 (11%) ubicados en los barrios de Belgrano, Barracas y Villa del Parque. Veamos como se conforman:

summary(filtro)
##         contacto       periodo                                  categoria   
##  00441631/21:   1   Min.   :202110   TRÁNSITO                        :1929  
##  00441632/21:   1   1st Qu.:202110   LIMPIEZA Y RECOLECCIÓN          :1830  
##  00441633/21:   1   Median :202110   BARRIOS EMERGENTES              : 782  
##  00441640/21:   1   Mean   :202110   CALLES Y VEREDAS                : 340  
##  00441647/21:   1   3rd Qu.:202110   ARBOLADO Y ESPACIOS VERDES      : 222  
##  00441654/21:   1   Max.   :202110   ORDENAMIENTO DEL ESPACIO PÚBLICO: 208  
##  (Other)    :5823                    (Other)                         : 518  
##                 subcategoria 
##  DENUNCIA VIAL        :1821  
##  RESIDUOS VOLUMINOSOS :1310  
##  DESOBSTRUCCIÓN       : 391  
##  CESTOS Y CONTENEDORES: 347  
##  DESAGOTE             : 285  
##  REPARACIÓN DE VEREDA : 253  
##  (Other)              :1422  
##                                        prestacion    tipo_prestacion
##  Vehículo mal estacionado                   :1787   Denuncia :2159  
##  Retiro de escombros / restos de obra       : 953   Queja    : 185  
##  Desobstrucción (Vactor)                    : 391   Reporte  :  88  
##  Desagote de pozo ciego (atmosférico)       : 285   Servicio :1314  
##  Retiro de restos de jardinería domiciliaria: 209   Solicitud:2083  
##  Reparación de vereda                       : 164                   
##  (Other)                                    :2040                   
##   domicilio_comuna         domicilio_barrio               canal     
##  Comuna 13:2675    Belgrano        :2675    App BA 147       :2182  
##  Comuna 11:1581    Villa Del Parque:1582    GCS Web          :1502  
##  Comuna 4 :1572    Barracas        :1572    App Denuncia Vial: 891  
##  Comuna 15:   1    Agronomia       :   0    Operador UGIS    : 782  
##  Comuna 1 :   0    Almagro         :   0    Boti             : 434  
##  Comuna 10:   0    Balvanera       :   0    Comuna           :  26  
##  (Other)  :   0    (Other)         :   0    (Other)          :  12  
##        genero    
##           : 782  
##  Femenino :2312  
##  Masculino:2729  
##  Otros    :   6  
##                  
##                  
## 

Ahora, con este filtro, la categoría predominante es “Tránsito” y la prestación “Vehículo mal estacionado”.

Si quisiésemos hacer lo contrario, es decir filtrar todos los registros que no estén ubicados en estos barrios debemos utilizar ! + %in% de la siguiente forma:

filtro <- filter(suaci_202110, !(domicilio_barrio %in% c("Belgrano", "Barracas", "Villa Del Parque")))

summary(filtro)
##         contacto        periodo                            categoria    
##  00441634/21:    1   Min.   :202110   LIMPIEZA Y RECOLECCIÓN    :16370  
##  00441635/21:    1   1st Qu.:202110   TRÁNSITO                  :14108  
##  00441636/21:    1   Median :202110   CALLES Y VEREDAS          : 3893  
##  00441637/21:    1   Mean   :202110   BARRIOS EMERGENTES        : 3493  
##  00441638/21:    1   3rd Qu.:202110   ARBOLADO Y ESPACIOS VERDES: 2238  
##  00441639/21:    1   Max.   :202110   TRÁMITES Y SERVICIOS      : 1285  
##  (Other)    :47091                    (Other)                   : 5710  
##                   subcategoria  
##  DENUNCIA VIAL          :12938  
##  RESIDUOS VOLUMINOSOS   :11906  
##  REPARACIÓN DE VEREDA   : 3089  
##  CESTOS Y CONTENEDORES  : 2716  
##  LIMPIEZA DE VÍA PÚBLICA: 1737  
##  DESAGOTE               : 1613  
##  (Other)                :13098  
##                                                         prestacion   
##  Vehículo mal estacionado                                    :12688  
##  Retiro de escombros / restos de obra                        : 8639  
##  Reparación de vereda                                        : 1958  
##  Retiro de restos de jardinería domiciliaria                 : 1776  
##  Desagote de pozo ciego (atmosférico)                        : 1613  
##  Retiro de residuos voluminosos (muebles y electrodomésticos): 1491  
##  (Other)                                                     :18932  
##   tipo_prestacion   domicilio_comuna      domicilio_barrio
##  Denuncia :15732   Comuna 12: 4993   Palermo      : 4091  
##  Queja    : 2249   Comuna 15: 4314   Flores       : 3030  
##  Reporte  :  852   Comuna 14: 4067   Caballito    : 2865  
##  Servicio :11935   Comuna 7 : 3992   Villa Urquiza: 2267  
##  Solicitud:16329   Comuna 11: 3618   Villa Devoto : 2014  
##                    Comuna 10: 3408   (Other)      :32028  
##                    (Other)  :22705   NA's         :  802  
##                canal             genero     
##  App BA 147       :16166            : 3492  
##  GCS Web          :16082   Femenino :19128  
##  App Denuncia Vial: 6849   Masculino:24435  
##  Boti             : 3995   Otros    :   42  
##  Operador UGIS    : 3492                    
##  Comuna           :  350                    
##  (Other)          :  163

Hasta acá vimos como podemos filtrar una base de datos a partir de escribir el contenido exacto que buscamos, es decir, si queríamos filtrar por la Comuna 11, no alcanzaba con poner “11” sino que teníamos que poner el nombre completo “Comuna 11” (respetando mayúsculas y minúsculas) para que la función se ejecute correctamente. Sin embargo, probablemente les pase que, cuando apliquen lo aprendido sobre otras bases de datos, quieran filtrar por una condición sin saber exactamente como está escrito el contenido. Tengo una buena noticia, ¡En R hay código para todo! ¡Incluso para lograr esto!:

Por ejemplo, si necesitan filtrar todos los registros de la Comuna 11 solamente poniendo el número pueden hacer lo siguiente:

filtro <- filter(suaci_202110, str_detect(domicilio_comuna, "11"))

summary(filtro)
##         contacto       periodo                                    categoria   
##  00441638/21:   1   Min.   :202110   LIMPIEZA Y RECOLECCIÓN            :2362  
##  00441650/21:   1   1st Qu.:202110   TRÁNSITO                          :1494  
##  00441659/21:   1   Median :202110   CALLES Y VEREDAS                  : 497  
##  00441672/21:   1   Mean   :202110   ARBOLADO Y ESPACIOS VERDES        : 335  
##  00441692/21:   1   3rd Qu.:202110   ALUMBRADO                         : 141  
##  00441733/21:   1   Max.   :202110   CONTROL EDILICIO, OBRAS Y CATASTRO:  87  
##  (Other)    :5193                    (Other)                           : 283  
##                                subcategoria 
##  RESIDUOS VOLUMINOSOS                :1628  
##  DENUNCIA VIAL                       :1344  
##  CESTOS Y CONTENEDORES               : 467  
##  REPARACIÓN DE VEREDA                : 398  
##  LIMPIEZA DE VÍA PÚBLICA             : 266  
##  PODA DE ÁRBOL Y DESPEJE DE LUMINARIA: 142  
##  (Other)                             : 954  
##                                                         prestacion  
##  Vehículo mal estacionado                                    :1307  
##  Retiro de escombros / restos de obra                        :1029  
##  Retiro de restos de jardinería domiciliaria                 : 387  
##  Reparación de vereda                                        : 244  
##  Retiro de residuos voluminosos (muebles y electrodomésticos): 212  
##  Poda de árbol/despeje de luminaria o semáforo               : 142  
##  (Other)                                                     :1878  
##   tipo_prestacion  domicilio_comuna          domicilio_barrio
##  Denuncia :1529   Comuna 11:5199    Villa Devoto     :2011   
##  Queja    : 265   Comuna 1 :   0    Villa Del Parque :1581   
##  Reporte  :  80   Comuna 10:   0    Villa Santa Rita : 896   
##  Servicio :1631   Comuna 12:   0    Villa Gral. Mitre: 707   
##  Solicitud:1694   Comuna 13:   0    Flores           :   2   
##                   Comuna 14:   0    Floresta         :   1   
##                   (Other)  :   0    (Other)          :   1   
##                canal            genero    
##  App BA 147       :2154            :   0  
##  GCS Web          :1768   Femenino :2472  
##  App Denuncia Vial: 703   Masculino:2726  
##  Boti             : 414   Otros    :   1  
##  Comuna           : 145                   
##  Mail 147         :  11                   
##  (Other)          :   4

Y si necesitan detectar una palabra sin distinguir entre mayúsculas y minúsculas tienen que sumar el parámetro “ignore_case = TRUE”:

filtro <- filter(suaci_202110, str_detect(domicilio_comuna, regex("comuna 11", ignore_case = TRUE)))

summary(filtro)
##         contacto       periodo                                    categoria   
##  00441638/21:   1   Min.   :202110   LIMPIEZA Y RECOLECCIÓN            :2362  
##  00441650/21:   1   1st Qu.:202110   TRÁNSITO                          :1494  
##  00441659/21:   1   Median :202110   CALLES Y VEREDAS                  : 497  
##  00441672/21:   1   Mean   :202110   ARBOLADO Y ESPACIOS VERDES        : 335  
##  00441692/21:   1   3rd Qu.:202110   ALUMBRADO                         : 141  
##  00441733/21:   1   Max.   :202110   CONTROL EDILICIO, OBRAS Y CATASTRO:  87  
##  (Other)    :5193                    (Other)                           : 283  
##                                subcategoria 
##  RESIDUOS VOLUMINOSOS                :1628  
##  DENUNCIA VIAL                       :1344  
##  CESTOS Y CONTENEDORES               : 467  
##  REPARACIÓN DE VEREDA                : 398  
##  LIMPIEZA DE VÍA PÚBLICA             : 266  
##  PODA DE ÁRBOL Y DESPEJE DE LUMINARIA: 142  
##  (Other)                             : 954  
##                                                         prestacion  
##  Vehículo mal estacionado                                    :1307  
##  Retiro de escombros / restos de obra                        :1029  
##  Retiro de restos de jardinería domiciliaria                 : 387  
##  Reparación de vereda                                        : 244  
##  Retiro de residuos voluminosos (muebles y electrodomésticos): 212  
##  Poda de árbol/despeje de luminaria o semáforo               : 142  
##  (Other)                                                     :1878  
##   tipo_prestacion  domicilio_comuna          domicilio_barrio
##  Denuncia :1529   Comuna 11:5199    Villa Devoto     :2011   
##  Queja    : 265   Comuna 1 :   0    Villa Del Parque :1581   
##  Reporte  :  80   Comuna 10:   0    Villa Santa Rita : 896   
##  Servicio :1631   Comuna 12:   0    Villa Gral. Mitre: 707   
##  Solicitud:1694   Comuna 13:   0    Flores           :   2   
##                   Comuna 14:   0    Floresta         :   1   
##                   (Other)  :   0    (Other)          :   1   
##                canal            genero    
##  App BA 147       :2154            :   0  
##  GCS Web          :1768   Femenino :2472  
##  App Denuncia Vial: 703   Masculino:2726  
##  Boti             : 414   Otros    :   1  
##  Comuna           : 145                   
##  Mail 147         :  11                   
##  (Other)          :   4

Pero esto no es todo, ¿Cómo hago si quiero filtrar por 2 o más condiciones a la vez?

En este caso debemos utilizar los siguientes operadores lógicos:

  • condición 1 & condición 2 -> se cumplen ambas condiciones a la vez
  • condición 1 | condición 2 -> se cumple una u otra de las condiciones
  • condición 1 & ! condición 2 -> se cumple la condición 1 pero no la condición 2
  • !condición 1 & condición 2 -> no se cumple la condición 1 pero si la condición 2
  • !(condición 1 & condición 2) -> no se cumple ninguna de las 2 condiciones

Por ejemplo, en el primer caso que hicimos 2 filtros sobre el mismo objeto, en vez de hacerlo por separado podríamos haberlo realizado de la siguiente forma:

filtro <- filter(suaci_202110, domicilio_comuna=="Comuna 11" & categoria=="ARBOLADO Y ESPACIOS VERDES")

summary(filtro)
##         contacto      periodo                                    categoria  
##  00441748/21:  1   Min.   :202110   ARBOLADO Y ESPACIOS VERDES        :335  
##  00442219/21:  1   1st Qu.:202110                                     :  0  
##  00442331/21:  1   Median :202110   ALUMBRADO                         :  0  
##  00442378/21:  1   Mean   :202110   BARRIOS EMERGENTES                :  0  
##  00442691/21:  1   3rd Qu.:202110   CALLES Y VEREDAS                  :  0  
##  00442716/21:  1   Max.   :202110   CONTROL EDILICIO, OBRAS Y CATASTRO:  0  
##  (Other)    :329                    (Other)                           :  0  
##                                   subcategoria
##  PODA DE ÁRBOL Y DESPEJE DE LUMINARIA   :142  
##  EXTRACCIÓN DE ÁRBOL                    : 78  
##  PROBLEMA CON INTERVENCIONES DE ARBOLADO: 71  
##  PLANTACIÓN DE ÁRBOL                    : 36  
##  PLAGAS / ENFERMEDADES EN ÁRBOL         :  7  
##  PARQUES Y PLAZAS                       :  1  
##  (Other)                                :  0  
##                                                       prestacion 
##  Poda de árbol/despeje de luminaria o semáforo             :142  
##  Extracción de árbol                                       : 78  
##  Problemas con intervenciones de arbolado                  : 64  
##  Plantación de árbol                                       : 36  
##  Árbol con enfermedades                                    :  7  
##  Falta de recolección de restos de poda de arbolado público:  7  
##  (Other)                                                   :  1  
##   tipo_prestacion  domicilio_comuna          domicilio_barrio
##  Denuncia :  0    Comuna 11:335     Villa Devoto     :154    
##  Queja    : 64    Comuna 1 :  0     Villa Del Parque : 87    
##  Reporte  :  7    Comuna 10:  0     Villa Santa Rita : 57    
##  Servicio :  0    Comuna 12:  0     Villa Gral. Mitre: 37    
##  Solicitud:264    Comuna 13:  0     Agronomia        :  0    
##                   Comuna 14:  0     Almagro          :  0    
##                   (Other)  :  0     (Other)          :  0    
##                canal           genero   
##  GCS Web          :148            :  0  
##  App BA 147       :145   Femenino :190  
##  Comuna           : 41   Masculino:145  
##  Mail 147         :  1   Otros    :  0  
##  App Denuncia Vial:  0                  
##  Boti             :  0                  
##  (Other)          :  0

O si además quisiese eliminar los registros que corresponden a algún barrio, por ejemplo Villa Devoto debería hacer el siguiente chunk:

filtro <- filter(suaci_202110, domicilio_comuna=="Comuna 11" & categoria=="ARBOLADO Y ESPACIOS VERDES" & domicilio_barrio != "Villa Devoto")

summary(filtro)
##         contacto      periodo                                    categoria  
##  00441748/21:  1   Min.   :202110   ARBOLADO Y ESPACIOS VERDES        :181  
##  00442331/21:  1   1st Qu.:202110                                     :  0  
##  00442378/21:  1   Median :202110   ALUMBRADO                         :  0  
##  00442691/21:  1   Mean   :202110   BARRIOS EMERGENTES                :  0  
##  00442716/21:  1   3rd Qu.:202110   CALLES Y VEREDAS                  :  0  
##  00443049/21:  1   Max.   :202110   CONTROL EDILICIO, OBRAS Y CATASTRO:  0  
##  (Other)    :175                    (Other)                           :  0  
##                                   subcategoria
##  PODA DE ÁRBOL Y DESPEJE DE LUMINARIA   :66   
##  EXTRACCIÓN DE ÁRBOL                    :44   
##  PROBLEMA CON INTERVENCIONES DE ARBOLADO:42   
##  PLANTACIÓN DE ÁRBOL                    :26   
##  PLAGAS / ENFERMEDADES EN ÁRBOL         : 3   
##                                         : 0   
##  (Other)                                : 0   
##                                                       prestacion
##  Poda de árbol/despeje de luminaria o semáforo             :66  
##  Extracción de árbol                                       :44  
##  Problemas con intervenciones de arbolado                  :38  
##  Plantación de árbol                                       :26  
##  Falta de recolección de restos de poda de arbolado público: 4  
##  Árbol con enfermedades                                    : 3  
##  (Other)                                                   : 0  
##   tipo_prestacion  domicilio_comuna          domicilio_barrio
##  Denuncia :  0    Comuna 11:181     Villa Del Parque :87     
##  Queja    : 38    Comuna 1 :  0     Villa Santa Rita :57     
##  Reporte  :  3    Comuna 10:  0     Villa Gral. Mitre:37     
##  Servicio :  0    Comuna 12:  0     Agronomia        : 0     
##  Solicitud:140    Comuna 13:  0     Almagro          : 0     
##                   Comuna 14:  0     Balvanera        : 0     
##                   (Other)  :  0     (Other)          : 0     
##                canal          genero   
##  App BA 147       :87            :  0  
##  GCS Web          :78   Femenino :106  
##  Comuna           :16   Masculino: 75  
##  App Denuncia Vial: 0   Otros    :  0  
##  Boti             : 0                  
##  Cercania         : 0                  
##  (Other)          : 0

Hagamos un ejemplo más para ver que pasa si queremos filtrar todos los registros pertenecientes a la Comuna 5 y a la Comuna 13:

filtro <- filter(suaci_202110, domicilio_comuna=="Comuna 5" & domicilio_comuna=="Comuna 13")

dim(filtro)
## [1]  0 10

El resultado es 0 porque un registro no puede pertenecer a ambas comunas al mismo tiempo, sin embargo si queremos filtrar aquellos que pertenecen a una u otra podemos hacerlo así:

filtro <- filter(suaci_202110, domicilio_comuna=="Comuna 5" | domicilio_comuna=="Comuna 13")

head(filtro)
##      contacto periodo              categoria          subcategoria
## 1 00443037/21  202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442314/21  202110               TRÁNSITO         DENUNCIA VIAL
## 3 00442458/21  202110               TRÁNSITO         DENUNCIA VIAL
## 4 00442993/21  202110               TRÁNSITO         DENUNCIA VIAL
## 5 00443043/21  202110               TRÁNSITO         DENUNCIA VIAL
## 6 00442102/21  202110               TRÁNSITO         DENUNCIA VIAL
##                  prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor       Solicitud        Comuna 13         Belgrano
## 2  Vehículo mal estacionado        Denuncia        Comuna 13         Belgrano
## 3  Vehículo mal estacionado        Denuncia        Comuna 13            Nuñez
## 4  Vehículo mal estacionado        Denuncia         Comuna 5          Almagro
## 5  Vehículo mal estacionado        Denuncia        Comuna 13         Belgrano
## 6  Vehículo mal estacionado        Denuncia         Comuna 5          Almagro
##               canal    genero
## 1        App BA 147  Femenino
## 2 App Denuncia Vial Masculino
## 3 App Denuncia Vial Masculino
## 4 App Denuncia Vial Masculino
## 5 App Denuncia Vial Masculino
## 6 App Denuncia Vial Masculino

Por último, otro tipo de filtro muy común es el que utilizamos para filtrar valores nulos (NA). Por ejemplo, quedémonos con todos los registros que tienen NAs en la variable domicilio_barrio:

filtro <- filter(suaci_202110, is.na(domicilio_barrio))

summary(filtro)
##         contacto      periodo                            categoria  
##  00441707/21:  1   Min.   :202110   TRÁMITES Y SERVICIOS      :667  
##  00441776/21:  1   1st Qu.:202110   MEDIOS DE TRANSPORTE      : 90  
##  00441940/21:  1   Median :202110   CALLES Y VEREDAS          : 34  
##  00442049/21:  1   Mean   :202110   SALUD Y SERVICIOS SOCIALES: 11  
##  00442051/21:  1   3rd Qu.:202110                             :  0  
##  00442052/21:  1   Max.   :202110   ALUMBRADO                 :  0  
##  (Other)    :796                    (Other)                   :  0  
##                                                                              subcategoria
##  ACCESO A LA INFORMACIÓN PÚBLICA                                                   :473  
##  PROPUESTAS PARA LA MEJORA EN TRÁMITES                                             :175  
##  BICICLETAS                                                                        : 46  
##  TAXIS                                                                             : 44  
##  OTROS                                                                             : 34  
##  INCONVENIENTE CON EL SISTEMA PARA LA INSCRIPCIÓN DE DEFUNCIONES (CARGA HOSPITALES): 19  
##  (Other)                                                                           : 11  
##                                                                prestacion 
##  Acceso a la información pública                                    :449  
##  Propuestas para la mejora en trámites                              :175  
##  Inconvenientes con el registro de usuario de BA Ecobici por Tembici: 45  
##  Felicitación / Agradecimiento                                      : 34  
##  Reclamo ante el Órgano Garante por Ley 104                         : 24  
##  Taxi: tarifa mal cobrada                                           : 20  
##  (Other)                                                            : 55  
##   tipo_prestacion  domicilio_comuna  domicilio_barrio               canal    
##  Denuncia : 11    Comuna NA:801     Agronomia:  0     GCS Web          :620  
##  Queja    :342    Comuna 1 :  1     Almagro  :  0     App BA 147       :175  
##  Reporte  :  0    Comuna 10:  0     Balvanera:  0     Operador GCBA    :  4  
##  Servicio :  0    Comuna 11:  0     Barracas :  0     Comuna           :  3  
##  Solicitud:449    Comuna 12:  0     Belgrano :  0     App Denuncia Vial:  0  
##                   Comuna 13:  0     (Other)  :  0     Boti             :  0  
##                   (Other)  :  0     NA's     :802     (Other)          :  0  
##        genero   
##           :  0  
##  Femenino :398  
##  Masculino:402  
##  Otros    :  2  
##                 
##                 
## 

En el resumen estadístico se ve que todas las observaciones que nos quedaron (802) tienen NA en la columna domicilio_barrio. Hagamos lo opuesto: filtremos los datos para quedarnos solo con las observaciones que no tienen NA en domicilio_barrio:

filtro <- filter(suaci_202110, !is.na(domicilio_barrio))

summary(filtro)
##         contacto        periodo                                  categoria    
##  00441631/21:    1   Min.   :202110   LIMPIEZA Y RECOLECCIÓN          :18200  
##  00441632/21:    1   1st Qu.:202110   TRÁNSITO                        :16037  
##  00441633/21:    1   Median :202110   BARRIOS EMERGENTES              : 4275  
##  00441634/21:    1   Mean   :202110   CALLES Y VEREDAS                : 4199  
##  00441635/21:    1   3rd Qu.:202110   ARBOLADO Y ESPACIOS VERDES      : 2460  
##  00441636/21:    1   Max.   :202110   ORDENAMIENTO DEL ESPACIO PÚBLICO: 1422  
##  (Other)    :52118                    (Other)                         : 5531  
##                   subcategoria  
##  DENUNCIA VIAL          :14759  
##  RESIDUOS VOLUMINOSOS   :13216  
##  REPARACIÓN DE VEREDA   : 3342  
##  CESTOS Y CONTENEDORES  : 3063  
##  LIMPIEZA DE VÍA PÚBLICA: 1906  
##  DESAGOTE               : 1898  
##  (Other)                :13940  
##                                        prestacion     tipo_prestacion 
##  Vehículo mal estacionado                   :14475   Denuncia :17880  
##  Retiro de escombros / restos de obra       : 9592   Queja    : 2092  
##  Reparación de vereda                       : 2122   Reporte  :  940  
##  Retiro de restos de jardinería domiciliaria: 1985   Servicio :13249  
##  Desagote de pozo ciego (atmosférico)       : 1898   Solicitud:17963  
##  Desobstrucción (Vactor)                    : 1761                    
##  (Other)                                    :20291                    
##   domicilio_comuna      domicilio_barrio               canal      
##  Comuna 11: 5199   Palermo      : 4091   App BA 147       :18173  
##  Comuna 12: 4993   Flores       : 3030   GCS Web          :16964  
##  Comuna 13: 4849   Caballito    : 2865   App Denuncia Vial: 7740  
##  Comuna 15: 4315   Belgrano     : 2675   Boti             : 4429  
##  Comuna 14: 4067   Villa Urquiza: 2267   Operador UGIS    : 4274  
##  Comuna 7 : 3992   Villa Devoto : 2014   Comuna           :  373  
##  (Other)  :24709   (Other)      :35182   (Other)          :  171  
##        genero     
##           : 4274  
##  Femenino :21042  
##  Masculino:26762  
##  Otros    :   46  
##                   
##                   
## 

¡Y así se pueden hacer todas las combinaciones de filtros que queramos!

Ahora, ¿Qué hacemos si en vez de quitar filas queremos quitar columnas? Bueno, aquí tenemos que usar la función de “seleccionar” que veremos a continuación.

Seleccionar columnas de interés

La función select() nos permite elegir u ordenar columnas de nuestro dataset. Esto se puede hacer indicando los nombres completos de las columnas, palabras que contienen, o la letra con la que empiezan o terminan.

Gráficamente sería algo así:

Por ejemplo, de la siguiente forma podríamos quedarnos solo con las columnas periodo, categoría, domicilio_comuna, domicilio_barrio:

seleccion <- select(suaci_202110, periodo, categoria, domicilio_comuna, domicilio_barrio)

head(seleccion)
##   periodo              categoria domicilio_comuna domicilio_barrio
## 1  202110 LIMPIEZA Y RECOLECCIÓN        Comuna 13         Belgrano
## 2  202110               TRÁNSITO        Comuna 10     Monte Castro
## 3  202110               TRÁNSITO         Comuna 1        San Telmo
## 4  202110               TRÁNSITO        Comuna 13         Belgrano
## 5  202110               TRÁNSITO         Comuna 1    Puerto Madero
## 6  202110               TRÁNSITO        Comuna 13            Nuñez

También podríamos elegir que columna/s no queremos tener más en nuestro dataset agregando un “-” antes de su nombre:

seleccion <- select(suaci_202110, -genero)

head(seleccion)
##      contacto periodo              categoria          subcategoria
## 1 00443037/21  202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21  202110               TRÁNSITO         DENUNCIA VIAL
## 3 00442090/21  202110               TRÁNSITO         DENUNCIA VIAL
## 4 00442314/21  202110               TRÁNSITO         DENUNCIA VIAL
## 5 00442395/21  202110               TRÁNSITO         DENUNCIA VIAL
## 6 00442458/21  202110               TRÁNSITO         DENUNCIA VIAL
##                  prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor       Solicitud        Comuna 13         Belgrano
## 2  Vehículo mal estacionado        Denuncia        Comuna 10     Monte Castro
## 3  Vehículo mal estacionado        Denuncia         Comuna 1        San Telmo
## 4  Vehículo mal estacionado        Denuncia        Comuna 13         Belgrano
## 5  Vehículo mal estacionado        Denuncia         Comuna 1    Puerto Madero
## 6  Vehículo mal estacionado        Denuncia        Comuna 13            Nuñez
##               canal
## 1        App BA 147
## 2 App Denuncia Vial
## 3 App Denuncia Vial
## 4 App Denuncia Vial
## 5 App Denuncia Vial
## 6 App Denuncia Vial

Con “:” podríamos indicar que queremos seleccionar un rango de columnas. Por ejemplo, desde periodo hasta domicilio_comuna:

seleccion <- select(suaci_202110, periodo:domicilio_comuna)

head(seleccion)
##   periodo              categoria          subcategoria
## 1  202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2  202110               TRÁNSITO         DENUNCIA VIAL
## 3  202110               TRÁNSITO         DENUNCIA VIAL
## 4  202110               TRÁNSITO         DENUNCIA VIAL
## 5  202110               TRÁNSITO         DENUNCIA VIAL
## 6  202110               TRÁNSITO         DENUNCIA VIAL
##                  prestacion tipo_prestacion domicilio_comuna
## 1 Reubicación de contenedor       Solicitud        Comuna 13
## 2  Vehículo mal estacionado        Denuncia        Comuna 10
## 3  Vehículo mal estacionado        Denuncia         Comuna 1
## 4  Vehículo mal estacionado        Denuncia        Comuna 13
## 5  Vehículo mal estacionado        Denuncia         Comuna 1
## 6  Vehículo mal estacionado        Denuncia        Comuna 13

O un rango según la posición que ocupan. Por ejemplo, de la 5 a la 8:

seleccion <- select(suaci_202110, 5:8)

head(seleccion)
##                  prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor       Solicitud        Comuna 13         Belgrano
## 2  Vehículo mal estacionado        Denuncia        Comuna 10     Monte Castro
## 3  Vehículo mal estacionado        Denuncia         Comuna 1        San Telmo
## 4  Vehículo mal estacionado        Denuncia        Comuna 13         Belgrano
## 5  Vehículo mal estacionado        Denuncia         Comuna 1    Puerto Madero
## 6  Vehículo mal estacionado        Denuncia        Comuna 13            Nuñez

Agregando un “-” adelante podríamos quedarnos con aquellas que no ocupan de la posición 5 a 8:

seleccion <- select(suaci_202110, -(5:8))

head(seleccion)
##      contacto periodo              categoria          subcategoria
## 1 00443037/21  202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21  202110               TRÁNSITO         DENUNCIA VIAL
## 3 00442090/21  202110               TRÁNSITO         DENUNCIA VIAL
## 4 00442314/21  202110               TRÁNSITO         DENUNCIA VIAL
## 5 00442395/21  202110               TRÁNSITO         DENUNCIA VIAL
## 6 00442458/21  202110               TRÁNSITO         DENUNCIA VIAL
##               canal    genero
## 1        App BA 147  Femenino
## 2 App Denuncia Vial Masculino
## 3 App Denuncia Vial Masculino
## 4 App Denuncia Vial Masculino
## 5 App Denuncia Vial Masculino
## 6 App Denuncia Vial Masculino

Otra opción es seleccionar columnas de acuerdo a la primer letra de los nombres. Por ejemplo aquellas que comienzan con la letra “p”:

seleccion <- select(suaci_202110, starts_with("p"))

head(seleccion)
##   periodo                prestacion
## 1  202110 Reubicación de contenedor
## 2  202110  Vehículo mal estacionado
## 3  202110  Vehículo mal estacionado
## 4  202110  Vehículo mal estacionado
## 5  202110  Vehículo mal estacionado
## 6  202110  Vehículo mal estacionado

O aquellas que sus nombres terminan con la letra “o”:

seleccion <- select(suaci_202110, ends_with("O"))

head(seleccion)
##      contacto periodo domicilio_barrio    genero
## 1 00443037/21  202110         Belgrano  Femenino
## 2 00442177/21  202110     Monte Castro Masculino
## 3 00442090/21  202110        San Telmo Masculino
## 4 00442314/21  202110         Belgrano Masculino
## 5 00442395/21  202110    Puerto Madero Masculino
## 6 00442458/21  202110            Nuñez Masculino

O aquellas que sus nombres contengan la palabra “domicilio”:

seleccione <- select(suaci_202110, contains("domicilio"))

head(seleccion)
##      contacto periodo domicilio_barrio    genero
## 1 00443037/21  202110         Belgrano  Femenino
## 2 00442177/21  202110     Monte Castro Masculino
## 3 00442090/21  202110        San Telmo Masculino
## 4 00442314/21  202110         Belgrano Masculino
## 5 00442395/21  202110    Puerto Madero Masculino
## 6 00442458/21  202110            Nuñez Masculino

Ordenar registros

Esta función nos permitirá ordenar las columnas en orden ascendente o descendente como se ve a continuación:

Probemos ordenar las filas de nuestro dataframe en función de los valores de una o más columnas. Por defecto se ordena en forma ascendente:

ordenar <- arrange(suaci_202110, domicilio_barrio)

head(ordenar)
##      contacto periodo                  categoria
## 1 00442945/21  202110                   TRÁNSITO
## 2 00442455/21  202110     LIMPIEZA Y RECOLECCIÓN
## 3 00442812/21  202110 ARBOLADO Y ESPACIOS VERDES
## 4 00443018/21  202110                  SEGURIDAD
## 5 00441762/21  202110     LIMPIEZA Y RECOLECCIÓN
## 6 00442785/21  202110     LIMPIEZA Y RECOLECCIÓN
##                              subcategoria
## 1                           DENUNCIA VIAL
## 2                   CESTOS Y CONTENEDORES
## 3 PROBLEMA CON INTERVENCIONES DE ARBOLADO
## 4                                   OTROS
## 5                    RESIDUOS VOLUMINOSOS
## 6                    RESIDUOS VOLUMINOSOS
##                                                   prestacion tipo_prestacion
## 1                                   Vehículo mal estacionado        Denuncia
## 2                                   Reparación de contenedor       Solicitud
## 3 Falta de recolección de restos de poda de arbolado público       Solicitud
## 4                                   Mayor presencia policial         Reporte
## 5                Retiro de restos de jardinería domiciliaria        Servicio
## 6                Retiro de restos de jardinería domiciliaria        Servicio
##   domicilio_comuna domicilio_barrio             canal    genero
## 1        Comuna 15        Agronomia App Denuncia Vial Masculino
## 2        Comuna 15        Agronomia           GCS Web  Femenino
## 3        Comuna 15        Agronomia           GCS Web  Femenino
## 4        Comuna 15        Agronomia        App BA 147 Masculino
## 5        Comuna 15        Agronomia           GCS Web  Femenino
## 6        Comuna 15        Agronomia        App BA 147 Masculino

Pero si queremos ordenar en forma descendente debemos aclararlo con desc():

ordenar <- arrange(suaci_202110, desc(domicilio_barrio))

head(ordenar)
##      contacto periodo categoria  subcategoria               prestacion
## 1 00442615/21  202110  TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## 2 00442206/21  202110  TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## 3 00443192/21  202110  TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## 4 00442625/21  202110  TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## 5 00443038/21  202110  TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## 6 00443191/21  202110  TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
##   tipo_prestacion domicilio_comuna domicilio_barrio             canal    genero
## 1        Denuncia        Comuna 12    Villa Urquiza App Denuncia Vial Masculino
## 2        Denuncia        Comuna 12    Villa Urquiza App Denuncia Vial Masculino
## 3        Denuncia        Comuna 12    Villa Urquiza App Denuncia Vial Masculino
## 4        Denuncia        Comuna 12    Villa Urquiza App Denuncia Vial Masculino
## 5        Denuncia        Comuna 12    Villa Urquiza App Denuncia Vial Masculino
## 6        Denuncia        Comuna 12    Villa Urquiza App Denuncia Vial Masculino

También podemos ordenar por 2 o más columnas. En este caso, R priorizará ordenar la primera, luego la segunda, y así sucesivamente. Veamos un ejemplo:

ordenar <- arrange(suaci_202110, domicilio_barrio, categoria)

head(ordenar)
##      contacto periodo                  categoria
## 1 00470309/21  202110                  ALUMBRADO
## 2 00491626/21  202110                  ALUMBRADO
## 3 00493160/21  202110                  ALUMBRADO
## 4 00493474/21  202110                  ALUMBRADO
## 5 00442812/21  202110 ARBOLADO Y ESPACIOS VERDES
## 6 00445376/21  202110 ARBOLADO Y ESPACIOS VERDES
##                              subcategoria
## 1              MAYOR ILUMINACIÓN EN CALLE
## 2                 REPARACIÓN DE LUMINARIA
## 3              MAYOR ILUMINACIÓN EN CALLE
## 4                 REPARACIÓN DE LUMINARIA
## 5 PROBLEMA CON INTERVENCIONES DE ARBOLADO
## 6                     PLANTACIÓN DE ÁRBOL
##                                                   prestacion tipo_prestacion
## 1                         Mayor iluminación en calle / plaza       Solicitud
## 2           Reparación de luminaria apagada durante la noche       Solicitud
## 3                         Mayor iluminación en calle / plaza       Solicitud
## 4           Reparación de luminaria apagada durante la noche       Solicitud
## 5 Falta de recolección de restos de poda de arbolado público       Solicitud
## 6                                        Plantación de árbol       Solicitud
##   domicilio_comuna domicilio_barrio         canal    genero
## 1        Comuna 15        Agronomia Operador GCBA  Femenino
## 2        Comuna 15        Agronomia    App BA 147  Femenino
## 3        Comuna 15        Agronomia    App BA 147  Femenino
## 4        Comuna 15        Agronomia    App BA 147  Femenino
## 5        Comuna 15        Agronomia       GCS Web  Femenino
## 6        Comuna 15        Agronomia       GCS Web Masculino

Modificar o agregar columnas

Ahora veamos como mutar nuestro dataset agregando nuevas columnas o cambiando el contenido de las existentes. Gráficamente sería algo así:

En este caso podríamos separar el contenido de una columna en 2, por ejemplo dividamos en año y mes la data que aparece en periodo. Para esto utilizaremos substr():

modificar <- mutate(suaci_202110,
                    year = substr(periodo, 1, 4),
                    month = substr(periodo, 5, 6))

head(modificar)
##      contacto periodo              categoria          subcategoria
## 1 00443037/21  202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21  202110               TRÁNSITO         DENUNCIA VIAL
## 3 00442090/21  202110               TRÁNSITO         DENUNCIA VIAL
## 4 00442314/21  202110               TRÁNSITO         DENUNCIA VIAL
## 5 00442395/21  202110               TRÁNSITO         DENUNCIA VIAL
## 6 00442458/21  202110               TRÁNSITO         DENUNCIA VIAL
##                  prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor       Solicitud        Comuna 13         Belgrano
## 2  Vehículo mal estacionado        Denuncia        Comuna 10     Monte Castro
## 3  Vehículo mal estacionado        Denuncia         Comuna 1        San Telmo
## 4  Vehículo mal estacionado        Denuncia        Comuna 13         Belgrano
## 5  Vehículo mal estacionado        Denuncia         Comuna 1    Puerto Madero
## 6  Vehículo mal estacionado        Denuncia        Comuna 13            Nuñez
##               canal    genero year month
## 1        App BA 147  Femenino 2021    10
## 2 App Denuncia Vial Masculino 2021    10
## 3 App Denuncia Vial Masculino 2021    10
## 4 App Denuncia Vial Masculino 2021    10
## 5 App Denuncia Vial Masculino 2021    10
## 6 App Denuncia Vial Masculino 2021    10

Otra aplicación que tiene mutate() es la de agregar columnas con algún contenido que elijamos nosotros, como por ejemplo sumemos una nueva columna que indique la fuente de donde descargamos toda esta información:

modificar <- mutate(suaci_202110, fuente="BA Data")

head(modificar)
##      contacto periodo              categoria          subcategoria
## 1 00443037/21  202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21  202110               TRÁNSITO         DENUNCIA VIAL
## 3 00442090/21  202110               TRÁNSITO         DENUNCIA VIAL
## 4 00442314/21  202110               TRÁNSITO         DENUNCIA VIAL
## 5 00442395/21  202110               TRÁNSITO         DENUNCIA VIAL
## 6 00442458/21  202110               TRÁNSITO         DENUNCIA VIAL
##                  prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor       Solicitud        Comuna 13         Belgrano
## 2  Vehículo mal estacionado        Denuncia        Comuna 10     Monte Castro
## 3  Vehículo mal estacionado        Denuncia         Comuna 1        San Telmo
## 4  Vehículo mal estacionado        Denuncia        Comuna 13         Belgrano
## 5  Vehículo mal estacionado        Denuncia         Comuna 1    Puerto Madero
## 6  Vehículo mal estacionado        Denuncia        Comuna 13            Nuñez
##               canal    genero  fuente
## 1        App BA 147  Femenino BA Data
## 2 App Denuncia Vial Masculino BA Data
## 3 App Denuncia Vial Masculino BA Data
## 4 App Denuncia Vial Masculino BA Data
## 5 App Denuncia Vial Masculino BA Data
## 6 App Denuncia Vial Masculino BA Data

O también podríamos completar una nueva columna de acuerdo a alguna condición, como por ejemplo llamarla “zona” y distinguir si las Comunas se ubican en el “Norte” o en el “Sur” de la Ciudad. Para esto utilizaremos case_when:

modificar <- mutate(suaci_202110, zona=case_when(domicilio_comuna %in% c("Comuna 1", "Comuna 3", "Comuna 5", "Comuna 7", "Comuna 8", "Comuna 9")~"Sur", TRUE ~ "Norte"))

summary(modificar)
##         contacto        periodo                                  categoria    
##  00441631/21:    1   Min.   :202110   LIMPIEZA Y RECOLECCIÓN          :18200  
##  00441632/21:    1   1st Qu.:202110   TRÁNSITO                        :16037  
##  00441633/21:    1   Median :202110   BARRIOS EMERGENTES              : 4275  
##  00441634/21:    1   Mean   :202110   CALLES Y VEREDAS                : 4233  
##  00441635/21:    1   3rd Qu.:202110   ARBOLADO Y ESPACIOS VERDES      : 2460  
##  00441636/21:    1   Max.   :202110   ORDENAMIENTO DEL ESPACIO PÚBLICO: 1422  
##  (Other)    :52920                    (Other)                         : 6299  
##                   subcategoria  
##  DENUNCIA VIAL          :14759  
##  RESIDUOS VOLUMINOSOS   :13216  
##  REPARACIÓN DE VEREDA   : 3342  
##  CESTOS Y CONTENEDORES  : 3063  
##  LIMPIEZA DE VÍA PÚBLICA: 1906  
##  DESAGOTE               : 1898  
##  (Other)                :14742  
##                                        prestacion     tipo_prestacion 
##  Vehículo mal estacionado                   :14475   Denuncia :17891  
##  Retiro de escombros / restos de obra       : 9592   Queja    : 2434  
##  Reparación de vereda                       : 2122   Reporte  :  940  
##  Retiro de restos de jardinería domiciliaria: 1985   Servicio :13249  
##  Desagote de pozo ciego (atmosférico)       : 1898   Solicitud:18412  
##  Desobstrucción (Vactor)                    : 1761                    
##  (Other)                                    :21093                    
##   domicilio_comuna      domicilio_barrio               canal      
##  Comuna 11: 5199   Palermo      : 4091   App BA 147       :18348  
##  Comuna 12: 4993   Flores       : 3030   GCS Web          :17584  
##  Comuna 13: 4849   Caballito    : 2865   App Denuncia Vial: 7740  
##  Comuna 15: 4315   Belgrano     : 2675   Boti             : 4429  
##  Comuna 14: 4067   Villa Urquiza: 2267   Operador UGIS    : 4274  
##  Comuna 7 : 3992   (Other)      :37196   Comuna           :  376  
##  (Other)  :25511   NA's         :  802   (Other)          :  175  
##        genero          zona          
##           : 4274   Length:52926      
##  Femenino :21440   Class :character  
##  Masculino:27164   Mode  :character  
##  Otros    :   48                     
##                                      
##                                      
## 

Con el summary() podemos ver que la nueva columna llamada “zona” se cargó como “character” y no como “factor”. Con mutate() también podemos modificar el tipo de dato dentro de una columna:

class(modificar$zona)
## [1] "character"

Vemos que la variable “zona” es de tipo character, así que cambiemos su formato a factor:

modificar <- mutate(modificar, zona=as.factor(zona))

class(modificar$zona)
## [1] "factor"
summary(modificar)
##         contacto        periodo                                  categoria    
##  00441631/21:    1   Min.   :202110   LIMPIEZA Y RECOLECCIÓN          :18200  
##  00441632/21:    1   1st Qu.:202110   TRÁNSITO                        :16037  
##  00441633/21:    1   Median :202110   BARRIOS EMERGENTES              : 4275  
##  00441634/21:    1   Mean   :202110   CALLES Y VEREDAS                : 4233  
##  00441635/21:    1   3rd Qu.:202110   ARBOLADO Y ESPACIOS VERDES      : 2460  
##  00441636/21:    1   Max.   :202110   ORDENAMIENTO DEL ESPACIO PÚBLICO: 1422  
##  (Other)    :52920                    (Other)                         : 6299  
##                   subcategoria  
##  DENUNCIA VIAL          :14759  
##  RESIDUOS VOLUMINOSOS   :13216  
##  REPARACIÓN DE VEREDA   : 3342  
##  CESTOS Y CONTENEDORES  : 3063  
##  LIMPIEZA DE VÍA PÚBLICA: 1906  
##  DESAGOTE               : 1898  
##  (Other)                :14742  
##                                        prestacion     tipo_prestacion 
##  Vehículo mal estacionado                   :14475   Denuncia :17891  
##  Retiro de escombros / restos de obra       : 9592   Queja    : 2434  
##  Reparación de vereda                       : 2122   Reporte  :  940  
##  Retiro de restos de jardinería domiciliaria: 1985   Servicio :13249  
##  Desagote de pozo ciego (atmosférico)       : 1898   Solicitud:18412  
##  Desobstrucción (Vactor)                    : 1761                    
##  (Other)                                    :21093                    
##   domicilio_comuna      domicilio_barrio               canal      
##  Comuna 11: 5199   Palermo      : 4091   App BA 147       :18348  
##  Comuna 12: 4993   Flores       : 3030   GCS Web          :17584  
##  Comuna 13: 4849   Caballito    : 2865   App Denuncia Vial: 7740  
##  Comuna 15: 4315   Belgrano     : 2675   Boti             : 4429  
##  Comuna 14: 4067   Villa Urquiza: 2267   Operador UGIS    : 4274  
##  Comuna 7 : 3992   (Other)      :37196   Comuna           :  376  
##  (Other)  :25511   NA's         :  802   (Other)          :  175  
##        genero         zona      
##           : 4274   Norte:35140  
##  Femenino :21440   Sur  :17786  
##  Masculino:27164                
##  Otros    :   48                
##                                 
##                                 
## 

Ahora ya podemos ver que hay más reclamos en las comunas del norte que en las del sur (35.140 vs 17.786).

En el ejemplo anterior utilizamos as.factor() pero si quisiésemos convertir una variable a character utilizaríamos as.character(), a numérica as.numeric() o a número entero as.integer().

Por último, veamos como unir 2 columnas de texto en una con paste():

modificar <- mutate(suaci_202110, comuna_barrio=paste(domicilio_comuna, domicilio_barrio, sep="_"))

head(modificar)
##      contacto periodo              categoria          subcategoria
## 1 00443037/21  202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21  202110               TRÁNSITO         DENUNCIA VIAL
## 3 00442090/21  202110               TRÁNSITO         DENUNCIA VIAL
## 4 00442314/21  202110               TRÁNSITO         DENUNCIA VIAL
## 5 00442395/21  202110               TRÁNSITO         DENUNCIA VIAL
## 6 00442458/21  202110               TRÁNSITO         DENUNCIA VIAL
##                  prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor       Solicitud        Comuna 13         Belgrano
## 2  Vehículo mal estacionado        Denuncia        Comuna 10     Monte Castro
## 3  Vehículo mal estacionado        Denuncia         Comuna 1        San Telmo
## 4  Vehículo mal estacionado        Denuncia        Comuna 13         Belgrano
## 5  Vehículo mal estacionado        Denuncia         Comuna 1    Puerto Madero
## 6  Vehículo mal estacionado        Denuncia        Comuna 13            Nuñez
##               canal    genero          comuna_barrio
## 1        App BA 147  Femenino     Comuna 13_Belgrano
## 2 App Denuncia Vial Masculino Comuna 10_Monte Castro
## 3 App Denuncia Vial Masculino     Comuna 1_San Telmo
## 4 App Denuncia Vial Masculino     Comuna 13_Belgrano
## 5 App Denuncia Vial Masculino Comuna 1_Puerto Madero
## 6 App Denuncia Vial Masculino        Comuna 13_Nuñez

También se pueden hacer operaciones matemáticas entre columnas cuando hay 2 o más con datos numéricos (sumar, restar, multiplicar, dividir), pero esto lo veremos en la próxima práctica.

Renombrar columnas

Esta función es muy útil cuando manipulamos datos ya que nos permite modificar los nombres de una o más columnas existentes en nuestro dataset.

Empecemos cambiando el nombre de la variable “contacto” por “ID”:

renombrar <- rename(suaci_202110, ID=contacto)

head(renombrar)
##            ID periodo              categoria          subcategoria
## 1 00443037/21  202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21  202110               TRÁNSITO         DENUNCIA VIAL
## 3 00442090/21  202110               TRÁNSITO         DENUNCIA VIAL
## 4 00442314/21  202110               TRÁNSITO         DENUNCIA VIAL
## 5 00442395/21  202110               TRÁNSITO         DENUNCIA VIAL
## 6 00442458/21  202110               TRÁNSITO         DENUNCIA VIAL
##                  prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor       Solicitud        Comuna 13         Belgrano
## 2  Vehículo mal estacionado        Denuncia        Comuna 10     Monte Castro
## 3  Vehículo mal estacionado        Denuncia         Comuna 1        San Telmo
## 4  Vehículo mal estacionado        Denuncia        Comuna 13         Belgrano
## 5  Vehículo mal estacionado        Denuncia         Comuna 1    Puerto Madero
## 6  Vehículo mal estacionado        Denuncia        Comuna 13            Nuñez
##               canal    genero
## 1        App BA 147  Femenino
## 2 App Denuncia Vial Masculino
## 3 App Denuncia Vial Masculino
## 4 App Denuncia Vial Masculino
## 5 App Denuncia Vial Masculino
## 6 App Denuncia Vial Masculino

Como habrán notado, primero hay que poner el nombre de la nueva columna y luego el de la columna actual. Esto es muy importante, porque si lo hacemos al revés nos dará un error.

Ahora veamos un ejemplo y cambiemos los nombres de 3 columnas:

renombrar <- rename(suaci_202110, ID=contacto, comuna=domicilio_comuna, barrio=domicilio_barrio)

head(renombrar)
##            ID periodo              categoria          subcategoria
## 1 00443037/21  202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21  202110               TRÁNSITO         DENUNCIA VIAL
## 3 00442090/21  202110               TRÁNSITO         DENUNCIA VIAL
## 4 00442314/21  202110               TRÁNSITO         DENUNCIA VIAL
## 5 00442395/21  202110               TRÁNSITO         DENUNCIA VIAL
## 6 00442458/21  202110               TRÁNSITO         DENUNCIA VIAL
##                  prestacion tipo_prestacion    comuna        barrio
## 1 Reubicación de contenedor       Solicitud Comuna 13      Belgrano
## 2  Vehículo mal estacionado        Denuncia Comuna 10  Monte Castro
## 3  Vehículo mal estacionado        Denuncia  Comuna 1     San Telmo
## 4  Vehículo mal estacionado        Denuncia Comuna 13      Belgrano
## 5  Vehículo mal estacionado        Denuncia  Comuna 1 Puerto Madero
## 6  Vehículo mal estacionado        Denuncia Comuna 13         Nuñez
##               canal    genero
## 1        App BA 147  Femenino
## 2 App Denuncia Vial Masculino
## 3 App Denuncia Vial Masculino
## 4 App Denuncia Vial Masculino
## 5 App Denuncia Vial Masculino
## 6 App Denuncia Vial Masculino

Y de esta forma, podríamos cambiar dentro de un solo chunk todos los nombres de columnas que necesitemos.

Bonus Track: Concatenar funciones

Llegamos al final de la clase, ya vimos varias funciones por separado, pero ¿Qué pasa si queremos aplicar varias a la vez dentro del mismo chunk? ¿Cómo podemos hacerlo?

En este caso debemos usar el operador pipe (%>%) Ctrl+Shift+M que sirve para encadenar funciones, y en vez de realizar una por una, poder realizar todas juntas.

Veamos un ejemplo:

Imaginemos que necesitamos obtener una base de datos que contenga únicamente la información de las columnas periodo, categoria, domicilio_comuna y domicilio_barrio para todos los registros de la Comuna 11. Y que además, queremos modificar los nombres de domicilio_comuna a comuna y de domicilio_barrio a barrio.

Así lo tendríamos que hacer según lo aprendido hasta ahora:

concatenar <- filter(suaci_202110, domicilio_comuna=="Comuna 11")

concatenar <- select(concatenar, periodo, categoria, domicilio_comuna, domicilio_barrio)

concatenar <- rename(concatenar, comuna=domicilio_comuna, barrio=domicilio_barrio)
summary(concatenar)
##     periodo                                    categoria          comuna    
##  Min.   :202110   LIMPIEZA Y RECOLECCIÓN            :2362   Comuna 11:5199  
##  1st Qu.:202110   TRÁNSITO                          :1494   Comuna 1 :   0  
##  Median :202110   CALLES Y VEREDAS                  : 497   Comuna 10:   0  
##  Mean   :202110   ARBOLADO Y ESPACIOS VERDES        : 335   Comuna 12:   0  
##  3rd Qu.:202110   ALUMBRADO                         : 141   Comuna 13:   0  
##  Max.   :202110   CONTROL EDILICIO, OBRAS Y CATASTRO:  87   Comuna 14:   0  
##                   (Other)                           : 283   (Other)  :   0  
##                barrio    
##  Villa Devoto     :2011  
##  Villa Del Parque :1581  
##  Villa Santa Rita : 896  
##  Villa Gral. Mitre: 707  
##  Flores           :   2  
##  Floresta         :   1  
##  (Other)          :   1

Con lo aprendido hasta ahora pudimos llegar perfectamente al resultado esperado pero fueron muchas líneas de código. Y además, si quisiésemos agregar más operaciones deberíamos escribir bastantes más pero, quédense tranquilos que desde R podemos concatenar las funciones y simplificar el código dentro del chunk.

Esto lo logramos con el pipe (%>%) de la siguiente forma:

concatenar <- suaci_202110 %>%
  filter(domicilio_comuna=="Comuna 11") %>%
  select(periodo, categoria, domicilio_comuna, domicilio_barrio) %>%
  rename(comuna=domicilio_comuna, barrio=domicilio_barrio)
summary(concatenar)
##     periodo                                    categoria          comuna    
##  Min.   :202110   LIMPIEZA Y RECOLECCIÓN            :2362   Comuna 11:5199  
##  1st Qu.:202110   TRÁNSITO                          :1494   Comuna 1 :   0  
##  Median :202110   CALLES Y VEREDAS                  : 497   Comuna 10:   0  
##  Mean   :202110   ARBOLADO Y ESPACIOS VERDES        : 335   Comuna 12:   0  
##  3rd Qu.:202110   ALUMBRADO                         : 141   Comuna 13:   0  
##  Max.   :202110   CONTROL EDILICIO, OBRAS Y CATASTRO:  87   Comuna 14:   0  
##                   (Other)                           : 283   (Other)  :   0  
##                barrio    
##  Villa Devoto     :2011  
##  Villa Del Parque :1581  
##  Villa Santa Rita : 896  
##  Villa Gral. Mitre: 707  
##  Flores           :   2  
##  Floresta         :   1  
##  (Other)          :   1

Como verán, en ambos casos llegamos al mismo resultado, pero sin dudas, la segunda opción es la recomendable porque nos ahorramos varias líneas de código y resultados intermedios.

¡Ahora les toca practicar a uds!