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.
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:
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:
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.
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
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
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.
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.
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!