Clase 2 MANIPULACIÓN 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 nuestro dataset (el mismo de la clase anterior):
<- read.csv("data/amba_properati.csv") datos_amba
A continuación veremos como el paquete tidyverse
nos va a permitir manipular nuestros datos a partir de las funciones: filtrar, modificar, seleccionar, ordenar, renombrar, resumir y agrupar.
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.
2.1 Filtrar registros que cumplan 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 AMBA y CABA, podríamos filtrar la data y quedarnos solo con los registros ubicados en CABA:
<- filter(datos_amba, provincia=="CABA")
filtro
head(filtro)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS
## 5 202006 CABA Comuna 13 2 60 50 32000 ARS
## 6 202006 CABA Comuna 13 2 53 44 26000 ARS
## title property_type operation_type lat lon
## 1 Departamento - Flores Departamento Alquiler -34.61917 -58.46222
## 2 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460 -58.46652
## 3 Departamento - Belgrano Departamento Alquiler -34.56318 -58.46461
## 4 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler -34.61836 -58.36090
## 5 Depto 2AMB c/ Suite y Toilette - Deheza 1600 - Incluye Cochera Departamento Alquiler -34.53795 -58.46671
## 6 Unico 2 ambientes A Estrenar! Posesion inmediata! - Nuñez Departamento Alquiler -34.54756 -58.47037
O los del mes de Julio 2020:
<- filter(datos_amba, created_on==202007)
filtro
head(filtro)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202007 GBA Tigre 2 108 69 20000 ARS
## 2 202007 GBA Tigre 2 57 45 27500 ARS
## 3 202007 CABA Comuna 14 1 45 40 23000 ARS
## 4 202007 CABA Comuna 14 2 48 48 30000 ARS
## 5 202007 CABA Comuna 14 2 42 37 26000 ARS
## 6 202007 CABA Comuna 15 2 41 38 21000 ARS
## title property_type operation_type lat lon
## 1 DEPARTAMENTO EN ALQUILER EN NORDELTA 2 AMB CON TERRAZA Y JACUZZI Departamento Alquiler -34.39437 -58.64925
## 2 2 ambientes con cochera y baulera - Vista al Lago Central Departamento Alquiler -34.40910 -58.63129
## 3 Departamento en Alquiler con Balcón y Amenities Departamento Alquiler -34.59274 -58.42749
## 4 Botánico - 2 ambientes amueblado con vista a Boulevard Cerviño Departamento Alquiler -34.57914 -58.41289
## 5 Departamento - Palermo Departamento Alquiler -34.59571 -58.41587
## 6 Departamento de 2 ambientes en Alquiler en Palermo Departamento Alquiler -34.59856 -58.43026
Nótese que para filtrar bajo la condición de “igual” utilicé “==”, pero también podría 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 solo con las propiedades que tienen una superficie cubierta mayor o igual a 75m2 debería escribirlo así:
<- filter(datos_amba, surface_covered>=75)
filtro
head(filtro)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 GBA Ituzaingó 3 75 75 19000 ARS
## 2 202006 GBA Tigre 3 95 80 42000 ARS
## 3 202006 GBA Tigre 3 98 90 42000 ARS
## 4 202006 CABA Comuna 13 3 109 94 90000 ARS
## 5 202006 CABA Comuna 14 3 152 152 240000 ARS
## 6 202006 CABA Comuna 14 3 90 85 80000 ARS
## title property_type
## 1 Americana a 6 cuadras de la estacion de S.A. de Padua Casa
## 2 3 AMBIENTES EN EDIFICIO MIRADORES DE LA BAHIA CON COCHERA FIJA Departamento
## 3 ¡EN EXCLUSIVA! Departamento en alquiler de 3 ambientes Miradores de La Bahía, Bahía de Nordelta. Departamento
## 4 Alquiler Depto 3 Amb a Estrenar Nuñez C/Cochera Departamento
## 5 ALQUILER en TORRES DE GELLY 152 m2 con 2 dorm dep y 1 coch ALTO vista Rio SIN muebles Departamento
## 6 ALQUILER 3 AMB CON DEPENDENCIA! - Y COCHERA TORRE AMENITIES!! Departamento
## operation_type lat lon
## 1 Alquiler -34.65957 -58.69712
## 2 Alquiler -34.39642 -58.64665
## 3 Alquiler -34.39512 -58.64665
## 4 Alquiler -34.54521 -58.46286
## 5 Alquiler -34.57760 -58.40499
## 6 Alquiler -34.59353 -58.41462
O si quiero eliminar los registros que corresponden a departamentos debería hacer el siguiente chunk:
<- filter(datos_amba, property_type!="Departamento")
filtro
head(filtro)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 GBA La Matanza 2 24 24 12000 ARS
## 2 202006 GBA General San Martín 2 40 40 15000 ARS
## 3 202006 GBA Ituzaingó 3 75 75 19000 ARS
## 4 202006 CABA Comuna 14 4 125 105 85000 ARS
## 5 202006 GBA Merlo 4 180 140 27000 ARS
## 6 202006 GBA Pilar 4 267 267 50000 ARS
## title property_type operation_type lat lon
## 1 PH - Lomas Del Mirador PH Alquiler -34.66253 -58.52914
## 2 PH - Chilavert PH Alquiler -34.54301 -58.57573
## 3 Americana a 6 cuadras de la estacion de S.A. de Padua Casa Alquiler -34.65957 -58.69712
## 4 PH en alquiler 4 ambientes - Las Cañitas PH Alquiler -34.57207 -58.43249
## 5 Casa en Padua 3 dormitorios en alquiler Casa Alquiler -34.66154 -58.71565
## 6 Casa en venta o alquiler en La Peregrina Casa Alquiler -34.47091 -58.82270
Si queremos filtrar todas las propiedades ubicadas en 3 partidos diferentes como por ejempo La Plata, General San Martín y La Matanza debemos utilizar %in% de la siguiente forma:
<- filter(datos_amba, partido %in% c("La Plata", "General San Martín", "La Matanza"))
filtro
head(filtro)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 GBA La Matanza 2 24 24 12000 ARS
## 2 202006 GBA General San Martín 2 40 40 15000 ARS
## 3 202006 GBA La Plata 2 50 50 18000 ARS
## 4 202006 GBA La Plata 2 35 35 13500 ARS
## 5 202006 GBA General San Martín 2 56 48 14000 ARS
## 6 202006 GBA La Plata 3 40 40 10000 ARS
## title property_type operation_type lat lon
## 1 PH - Lomas Del Mirador PH Alquiler -34.66253 -58.52914
## 2 PH - Chilavert PH Alquiler -34.54301 -58.57573
## 3 Alquiler, depto de un domitorio frente al parque San Martin Departamento Alquiler -34.93415 -57.96605
## 4 Departamento - La Plata Departamento Alquiler -34.90645 -57.97335
## 5 Departamento céntrico - Villa Ballester Departamento Alquiler -34.55038 -58.55512
## 6 Departamento - José Hernández Departamento Alquiler -34.89768 -58.02787
En cambio, si queremos filtrar todas las propiedades que no estén ubicadas en 3 partidos diferentes como por ejempo La Plata, General San Martín y La Matanza debemos utilizar ! + %in% de la siguiente forma:
<- filter(datos_amba, !(partido %in% c("La Plata", "General San Martín", "La Matanza")))
filtro
head(filtro)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS
## 5 202006 GBA Vicente López 1 36 27 19000 ARS
## 6 202006 CABA Comuna 13 2 60 50 32000 ARS
## title property_type operation_type lat
## 1 Departamento - Flores Departamento Alquiler -34.61917
## 2 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460
## 3 Departamento - Belgrano Departamento Alquiler -34.56318
## 4 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler -34.61836
## 5 Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento Alquiler -34.53344
## 6 Depto 2AMB c/ Suite y Toilette - Deheza 1600 - Incluye Cochera Departamento Alquiler -34.53795
## lon
## 1 -58.46222
## 2 -58.46652
## 3 -58.46461
## 4 -58.36090
## 5 -58.49345
## 6 -58.46671
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, si queremos filtrar todos los registros pertenecientes a la Comuna 5 y a la Comuna 13:
<- filter(datos_amba, partido=="Comuna 5" & partido=="Comuna 13")
filtro
head(filtro)
## [1] created_on provincia partido rooms surface_total surface_covered price
## [8] currency title property_type operation_type lat lon
## <0 rows> (or 0-length row.names)
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í:
<- filter(datos_amba, partido=="Comuna 5" | partido=="Comuna 13")
filtro
head(filtro)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 13 1 30 30 18000 ARS
## 2 202006 CABA Comuna 13 1 31 29 17900 ARS
## 3 202006 CABA Comuna 13 2 60 50 32000 ARS
## 4 202006 CABA Comuna 13 2 53 44 26000 ARS
## 5 202006 CABA Comuna 5 2 45 38 20000 ARS
## 6 202006 CABA Comuna 13 2 55 55 45000 ARS
## title property_type operation_type lat lon
## 1 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460 -58.46652
## 2 Departamento - Belgrano Departamento Alquiler -34.56318 -58.46461
## 3 Depto 2AMB c/ Suite y Toilette - Deheza 1600 - Incluye Cochera Departamento Alquiler -34.53795 -58.46671
## 4 Unico 2 ambientes A Estrenar! Posesion inmediata! - Nuñez Departamento Alquiler -34.54756 -58.47037
## 5 Departamento de 2 ambientes en Alquiler en Almagro Departamento Alquiler -34.60613 -58.42947
## 6 BLANCO ENCALADA AL 3000 A ESTRENAR Departamento Alquiler -34.56313 -58.46550
También podemos quedarnos con aquellas propiedades que estén en alquiler y que tengan más de 50m2:
<- filter(datos_amba, operation_type=="Alquiler" & surface_covered>=50)
filtro
head(filtro)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 13 2 60 50 32000 ARS
## 2 202006 CABA Comuna 13 2 55 55 45000 ARS
## 3 202006 GBA La Plata 2 50 50 18000 ARS
## 4 202006 GBA Ituzaingó 3 75 75 19000 ARS
## 5 202006 GBA Tigre 3 95 80 42000 ARS
## 6 202006 GBA Tigre 3 98 90 42000 ARS
## title property_type
## 1 Depto 2AMB c/ Suite y Toilette - Deheza 1600 - Incluye Cochera Departamento
## 2 BLANCO ENCALADA AL 3000 A ESTRENAR Departamento
## 3 Alquiler, depto de un domitorio frente al parque San Martin Departamento
## 4 Americana a 6 cuadras de la estacion de S.A. de Padua Casa
## 5 3 AMBIENTES EN EDIFICIO MIRADORES DE LA BAHIA CON COCHERA FIJA Departamento
## 6 ¡EN EXCLUSIVA! Departamento en alquiler de 3 ambientes Miradores de La Bahía, Bahía de Nordelta. Departamento
## operation_type lat lon
## 1 Alquiler -34.53795 -58.46671
## 2 Alquiler -34.56313 -58.46550
## 3 Alquiler -34.93415 -57.96605
## 4 Alquiler -34.65957 -58.69712
## 5 Alquiler -34.39642 -58.64665
## 6 Alquiler -34.39512 -58.64665
O con aquellas propiedades que se ubiquen en la Comuna 12, 13 o 14 y que no sean monoambientes:
<- filter(datos_amba, partido %in% c("Comuna 14", "Comuna 13", "Comuna 12") & ! rooms==1)
filtro
head(filtro)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 13 2 60 50 32000 ARS
## 2 202006 CABA Comuna 13 2 53 44 26000 ARS
## 3 202006 CABA Comuna 12 2 42 37 22000 ARS
## 4 202006 CABA Comuna 14 2 43 33 27000 ARS
## 5 202006 CABA Comuna 13 2 55 55 45000 ARS
## 6 202006 CABA Comuna 14 2 48 48 23000 ARS
## title property_type operation_type lat lon
## 1 Depto 2AMB c/ Suite y Toilette - Deheza 1600 - Incluye Cochera Departamento Alquiler -34.53795 -58.46671
## 2 Unico 2 ambientes A Estrenar! Posesion inmediata! - Nuñez Departamento Alquiler -34.54756 -58.47037
## 3 Depto 2AMB - Av. Balbin 3400 - ALQUILER Departamento Alquiler -34.55700 -58.47898
## 4 Dos ambientes con Balcón a Demaría y Patio. Departamento Alquiler -34.57421 -58.42243
## 5 BLANCO ENCALADA AL 3000 A ESTRENAR Departamento Alquiler -34.56313 -58.46550
## 6 Departamento - Belgrano Departamento Alquiler -34.56456 -58.43559
¡Y así se pueden hacer todas las combinaciones de filtros que querramos!
¿Y si en vez de quitar filas queremos quitar columnas? Bueno, aquí tenemos que usar la función de “seleccionar” que veremos a continuación.
2.2 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.
Graficamente sería algo así:
Por ejemplo, de la siguiente forma podríamos quedarnos solo con las columnas created_on, provincia, price y currency:
<- select(datos_amba, created_on, provincia, price, currency)
seleccion
head(seleccion)
## created_on provincia price currency
## 1 202006 CABA 22500 ARS
## 2 202006 CABA 18000 ARS
## 3 202006 CABA 17900 ARS
## 4 202006 CABA 42000 ARS
## 5 202006 GBA 19000 ARS
## 6 202006 GBA 12000 ARS
También podríamos elegir que columna/s no queremos tener más en nuestro dataset agregando un “-” antes de su nombre:
<- select(datos_amba, -title)
seleccion
head(seleccion)
## created_on provincia partido rooms surface_total surface_covered price currency property_type operation_type
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS Departamento Alquiler
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS Departamento Alquiler
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS Departamento Alquiler
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS Departamento Alquiler
## 5 202006 GBA Vicente López 1 36 27 19000 ARS Departamento Alquiler
## 6 202006 GBA La Matanza 2 24 24 12000 ARS PH Alquiler
## lat lon
## 1 -34.61917 -58.46222
## 2 -34.55460 -58.46652
## 3 -34.56318 -58.46461
## 4 -34.61836 -58.36090
## 5 -34.53344 -58.49345
## 6 -34.66253 -58.52914
Con “:” podríamos indicar que queremos seleccionar un rango de columnas. Desde price hasta operation_type:
<- select(datos_amba, price:operation_type)
seleccion
head(seleccion)
## price currency title property_type
## 1 22500 ARS Departamento - Flores Departamento
## 2 18000 ARS Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento
## 3 17900 ARS Departamento - Belgrano Departamento
## 4 42000 ARS Monoambiente con cochera. Zencity. Puerto Madero Departamento
## 5 19000 ARS Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento
## 6 12000 ARS PH - Lomas Del Mirador PH
## operation_type
## 1 Alquiler
## 2 Alquiler
## 3 Alquiler
## 4 Alquiler
## 5 Alquiler
## 6 Alquiler
O con las que ocupan de la posición 7 a la 10:
<- select(datos_amba, 7:10)
seleccion
head(seleccion)
## price currency title property_type
## 1 22500 ARS Departamento - Flores Departamento
## 2 18000 ARS Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento
## 3 17900 ARS Departamento - Belgrano Departamento
## 4 42000 ARS Monoambiente con cochera. Zencity. Puerto Madero Departamento
## 5 19000 ARS Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento
## 6 12000 ARS PH - Lomas Del Mirador PH
O agregando un “-” adelante podríamos quedarnos con aquellas que no ocupan de la posición 7 a 10:
<- select(datos_amba, -(7:10))
seleccion
head(seleccion)
## created_on provincia partido rooms surface_total surface_covered operation_type lat lon
## 1 202006 CABA Comuna 7 1 40 37 Alquiler -34.61917 -58.46222
## 2 202006 CABA Comuna 13 1 30 30 Alquiler -34.55460 -58.46652
## 3 202006 CABA Comuna 13 1 31 29 Alquiler -34.56318 -58.46461
## 4 202006 CABA Comuna 1 1 35 35 Alquiler -34.61836 -58.36090
## 5 202006 GBA Vicente López 1 36 27 Alquiler -34.53344 -58.49345
## 6 202006 GBA La Matanza 2 24 24 Alquiler -34.66253 -58.52914
Otra opción es seleccionar columnas de acuerdo a la primer letra de los nombres. Por ejemplo aquellas que comienzan con la letra “p”:
<- select(datos_amba, starts_with("p"))
seleccion
head(seleccion)
## provincia partido price property_type
## 1 CABA Comuna 7 22500 Departamento
## 2 CABA Comuna 13 18000 Departamento
## 3 CABA Comuna 13 17900 Departamento
## 4 CABA Comuna 1 42000 Departamento
## 5 GBA Vicente López 19000 Departamento
## 6 GBA La Matanza 12000 PH
O aquellas que sus nombres terminan con la letra “e”:
<- select(datos_amba, ends_with("e"))
seleccion
head(seleccion)
## price title property_type operation_type
## 1 22500 Departamento - Flores Departamento Alquiler
## 2 18000 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler
## 3 17900 Departamento - Belgrano Departamento Alquiler
## 4 42000 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler
## 5 19000 Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento Alquiler
## 6 12000 PH - Lomas Del Mirador PH Alquiler
O que sus nombres contengan la palabra “surface”:
<- select(datos_amba, contains("surface"))
seleccion
head(seleccion)
## surface_total surface_covered
## 1 40 37
## 2 30 30
## 3 31 29
## 4 35 35
## 5 36 27
## 6 24 24
2.3 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í:
Aprovechando que tenemos los datos del precio total (price) y superficie cubierta (surface_covered) de cada una de las propiedades, agreguemos una nueva columna a nuestro dataset que incluya el valor del m2:
<- mutate(datos_amba, price_m2=price/surface_covered)
modificar
head(modificar)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS
## 5 202006 GBA Vicente López 1 36 27 19000 ARS
## 6 202006 GBA La Matanza 2 24 24 12000 ARS
## title property_type operation_type lat
## 1 Departamento - Flores Departamento Alquiler -34.61917
## 2 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460
## 3 Departamento - Belgrano Departamento Alquiler -34.56318
## 4 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler -34.61836
## 5 Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento Alquiler -34.53344
## 6 PH - Lomas Del Mirador PH Alquiler -34.66253
## lon price_m2
## 1 -58.46222 608.1081
## 2 -58.46652 600.0000
## 3 -58.46461 617.2414
## 4 -58.36090 1200.0000
## 5 -58.49345 703.7037
## 6 -58.52914 500.0000
Si queremos redondear el resultado obtenido, principalmente cuando es una división y por default nos pone varios decimales, tenemos que usar round()
y asignar la cantidad de decimales deseados, en este caso usaré 2:
<- mutate(datos_amba, price_m2=round(price/surface_covered, 2))
modificar
head(modificar)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS
## 5 202006 GBA Vicente López 1 36 27 19000 ARS
## 6 202006 GBA La Matanza 2 24 24 12000 ARS
## title property_type operation_type lat
## 1 Departamento - Flores Departamento Alquiler -34.61917
## 2 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460
## 3 Departamento - Belgrano Departamento Alquiler -34.56318
## 4 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler -34.61836
## 5 Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento Alquiler -34.53344
## 6 PH - Lomas Del Mirador PH Alquiler -34.66253
## lon price_m2
## 1 -58.46222 608.11
## 2 -58.46652 600.00
## 3 -58.46461 617.24
## 4 -58.36090 1200.00
## 5 -58.49345 703.70
## 6 -58.52914 500.00
Como verán, para hacer cálculos entre columnas numéricas podemos utilizar:
- A / B A dividido B
- A * B A multiplicado por B
- A + B Suma de A y B
- A - B Resta de A menos B
También podríamos agregar una columna que refleje un cálculo entre una columna existente y un valor extra, por ejemplo pasemos la superficie total de m2 a cm2:
<- mutate(datos_amba, surface_total_cm2=surface_total*10000)
modificar
head(modificar)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS
## 5 202006 GBA Vicente López 1 36 27 19000 ARS
## 6 202006 GBA La Matanza 2 24 24 12000 ARS
## title property_type operation_type lat
## 1 Departamento - Flores Departamento Alquiler -34.61917
## 2 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460
## 3 Departamento - Belgrano Departamento Alquiler -34.56318
## 4 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler -34.61836
## 5 Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento Alquiler -34.53344
## 6 PH - Lomas Del Mirador PH Alquiler -34.66253
## lon surface_total_cm2
## 1 -58.46222 400000
## 2 -58.46652 300000
## 3 -58.46461 310000
## 4 -58.36090 350000
## 5 -58.49345 360000
## 6 -58.52914 240000
Dejando de lado los cálculos, otra posibilidad que tenemos es separar el contenido de una columna en 2, por ejemplo dividamos en año y mes la data que aparece en created_on. Para esto utilizaremos substr()
:
<- mutate(datos_amba,
modificar year = substr(created_on, 1, 4),
month = substr(created_on, 5, 6))
head(modificar)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS
## 5 202006 GBA Vicente López 1 36 27 19000 ARS
## 6 202006 GBA La Matanza 2 24 24 12000 ARS
## title property_type operation_type lat
## 1 Departamento - Flores Departamento Alquiler -34.61917
## 2 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460
## 3 Departamento - Belgrano Departamento Alquiler -34.56318
## 4 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler -34.61836
## 5 Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento Alquiler -34.53344
## 6 PH - Lomas Del Mirador PH Alquiler -34.66253
## lon year month
## 1 -58.46222 2020 06
## 2 -58.46652 2020 06
## 3 -58.46461 2020 06
## 4 -58.36090 2020 06
## 5 -58.49345 2020 06
## 6 -58.52914 2020 06
Otra aplicación que tiene mutate()
es la de agregar columnas con algun contenido que elijamos nosotros, como por ejemplo sumemos una nueva columna que indique la fuente de donde descargamos toda esta información:
<- mutate(datos_amba, fuente="Properati")
modificar
head(modificar)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS
## 5 202006 GBA Vicente López 1 36 27 19000 ARS
## 6 202006 GBA La Matanza 2 24 24 12000 ARS
## title property_type operation_type lat
## 1 Departamento - Flores Departamento Alquiler -34.61917
## 2 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460
## 3 Departamento - Belgrano Departamento Alquiler -34.56318
## 4 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler -34.61836
## 5 Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento Alquiler -34.53344
## 6 PH - Lomas Del Mirador PH Alquiler -34.66253
## lon fuente
## 1 -58.46222 Properati
## 2 -58.46652 Properati
## 3 -58.46461 Properati
## 4 -58.36090 Properati
## 5 -58.49345 Properati
## 6 -58.52914 Properati
Ahora veamos como modificar el tipo de dato dentro de una columna:
class(datos_amba$title)
## [1] "factor"
Vemos que la variable “title” es de tipo factor, así que cambiemos su formato a character:
<- mutate(datos_amba, title=as.character(title))
modificar
class(modificar$title)
## [1] "character"
En el ejemplo anterior utilizamos as.character()
pero si quisiesemos convertir una variable a factor utilizariamos as.factor()
, 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()
:
<- mutate(datos_amba, prov_partido=paste(provincia, partido, sep="_"))
modificar
head(modificar)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS
## 5 202006 GBA Vicente López 1 36 27 19000 ARS
## 6 202006 GBA La Matanza 2 24 24 12000 ARS
## title property_type operation_type lat
## 1 Departamento - Flores Departamento Alquiler -34.61917
## 2 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460
## 3 Departamento - Belgrano Departamento Alquiler -34.56318
## 4 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler -34.61836
## 5 Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento Alquiler -34.53344
## 6 PH - Lomas Del Mirador PH Alquiler -34.66253
## lon prov_partido
## 1 -58.46222 CABA_Comuna 7
## 2 -58.46652 CABA_Comuna 13
## 3 -58.46461 CABA_Comuna 13
## 4 -58.36090 CABA_Comuna 1
## 5 -58.49345 GBA_Vicente López
## 6 -58.52914 GBA_La Matanza
2.4 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 data frame en función de los valores de una o más columnas. Por defecto se ordena en forma ascendente:
<- arrange(datos_amba, surface_total)
ordenar
head(ordenar)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202007 CABA Comuna 15 1 10 10 25000 USD
## 2 202006 GBA Tigre 2 12 12 10500 ARS
## 3 202007 CABA Comuna 1 1 14 14 35000 USD
## 4 202006 CABA Comuna 2 1 15 15 12900 ARS
## 5 202007 CABA Comuna 15 1 18 18 48000 USD
## 6 202006 GBA Morón 1 18 17 35000 USD
## title property_type operation_type lat
## 1 Garage - Cochera Descubierta en Villa Crespo Departamento Venta -34.60330
## 2 Departamento de 2 ambientes en Pradera, Santa Barbara Departamento Alquiler -34.44604
## 3 VENTA PH 13,84 M2 PANTA BAJA BALVANERA PH Venta -34.61566
## 4 Departamento en Alquiler en Barrio Norte Departamento Alquiler -34.59092
## 5 Venta Monoambiente estudio con amenities Chacarita Departamento Venta -34.59043
## 6 Lindo monoambiente en 2do piso por escalera al frente. BAJAS EXPENSAS!!! Departamento Venta -34.64390
## lon
## 1 -58.45547
## 2 -58.63236
## 3 -58.39221
## 4 -58.40632
## 5 -58.44666
## 6 -58.63221
Pero si queremos ordenar en forma descendente debemos aclararlo con desc()
:
<- arrange(datos_amba, desc(surface_total))
ordenar
head(ordenar)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202007 GBA Pilar 5 5000 300 120000 USD
## 2 202006 GBA San Vicente 3 4356 150 85000 USD
## 3 202007 GBA Pilar 6 3780 320 220000 USD
## 4 202006 CABA Comuna 13 2 3650 35 109500 USD
## 5 202007 GBA Luján 4 2703 182 370000 USD
## 6 202007 GBA Pilar 3 2500 70 121000 USD
## title property_type operation_type lat lon
## 1 Venta de Casa Quinta Casa Venta -34.40066 -58.86919
## 2 España entre Buchard y Esmeralda. Casa en venta, San Viciente Casa Venta -35.02984 -58.40594
## 3 Venta casaquinta Del Viso Residencial Los Jazmines Casa Venta -34.45687 -58.79651
## 4 Acogedor Departamento de dos ambientes en Belgrano Departamento Venta -34.55398 -58.44853
## 5 Casa 3 dormitorios estilo campo Estancias Golf Casa Venta -34.49543 -59.00930
## 6 VENTA CASA 2 AMBIENTES PILAR 2500 M2 DE PARQUE!! Casa Venta -34.41586 -58.85729
También podemos ordenar por 2 o más columnas. En este caso, R priorizará ordenar la primera, luego la segunda, y asi sucesivamente. Veamos un ejemplo:
<- arrange(datos_amba, partido, rooms)
ordenar
head(ordenar)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202006 GBA Almirante Brown 2 40 40 14500 ARS
## 2 202006 GBA Almirante Brown 2 60 60 20000 ARS
## 3 202006 GBA Almirante Brown 2 50 50 125000 USD
## 4 202007 GBA Almirante Brown 2 52 48 18000 ARS
## 5 202007 GBA Almirante Brown 2 47 47 16000 ARS
## 6 202007 GBA Almirante Brown 2 50 50 96000 USD
## title property_type operation_type
## 1 Departamento en alquiler Departamento Alquiler
## 2 Departamento - Adrogue Departamento Alquiler
## 3 Departamento - Adrogue Departamento Venta
## 4 Venta de Departamento 2 ambientes en Hermoso Edificio a metros de Plaza Brown de Adrogué Departamento Alquiler
## 5 DEPARTAMENTO 2 AMBIENTES EN AV ESPORA AL 800 Departamento Alquiler
## 6 Departamento - Adrogue Departamento Venta
## lat lon
## 1 -34.81144 -58.39264
## 2 -34.79964 -58.38278
## 3 -34.79732 -58.39132
## 4 -34.79720 -58.38280
## 5 -34.79880 -58.38863
## 6 -34.79913 -58.38364
<- arrange(datos_amba, partido, desc(rooms))
ordenar
head(ordenar)
## created_on provincia partido rooms surface_total surface_covered price currency
## 1 202007 GBA Almirante Brown 8 447 189 230000 USD
## 2 202006 GBA Almirante Brown 7 670 590 1500000 USD
## 3 202006 GBA Almirante Brown 5 239 112 169000 USD
## 4 202006 GBA Almirante Brown 5 260 120 248000 USD
## 5 202007 GBA Almirante Brown 5 370 220 230000 USD
## 6 202006 GBA Almirante Brown 5 180 180 390000 USD
## title property_type operation_type
## 1 Casa c/2 dptos, local y galpón - Lomas del Mirador Casa Venta
## 2 Casa - Adrogue Casa Venta
## 3 A REFACCIONAR! Casona colonial con gran lote, fondo libre, parrilla, 3 dormitorios 2 baños PH Venta
## 4 Hermoso Duplex 3 dormitorios gran patio 4 cocheras Casa Venta
## 5 Chalet en venta Barrio Santa Rita - Longchamps Casa Venta
## 6 Casa en Construccion en Venta en Barrio Privado 'Brisas de Adrogue' Casa Venta
## lat lon
## 1 -34.86568 -58.37823
## 2 -34.80905 -58.40631
## 3 -34.79638 -58.38691
## 4 -34.79746 -58.37885
## 5 -34.86473 -58.39129
## 6 -34.81368 -58.40300
2.5 Renombrar columnas
Ahora veamos como cambiar los nombres a una o más columnas existentes en nuestro dataset:
Empecemos cambiando el nombre de la variable “rooms” por “ambientes”:
<- rename(datos_amba, ambientes=rooms)
renombrar
head(renombrar)
## created_on provincia partido ambientes surface_total surface_covered price currency
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS
## 5 202006 GBA Vicente López 1 36 27 19000 ARS
## 6 202006 GBA La Matanza 2 24 24 12000 ARS
## title property_type operation_type lat
## 1 Departamento - Flores Departamento Alquiler -34.61917
## 2 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460
## 3 Departamento - Belgrano Departamento Alquiler -34.56318
## 4 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler -34.61836
## 5 Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento Alquiler -34.53344
## 6 PH - Lomas Del Mirador PH Alquiler -34.66253
## lon
## 1 -58.46222
## 2 -58.46652
## 3 -58.46461
## 4 -58.36090
## 5 -58.49345
## 6 -58.52914
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:
<- rename(datos_amba, ambientes=rooms, m2_cubierto=surface_covered, m2_total=surface_total)
renombrar
head(renombrar)
## created_on provincia partido ambientes m2_total m2_cubierto price currency
## 1 202006 CABA Comuna 7 1 40 37 22500 ARS
## 2 202006 CABA Comuna 13 1 30 30 18000 ARS
## 3 202006 CABA Comuna 13 1 31 29 17900 ARS
## 4 202006 CABA Comuna 1 1 35 35 42000 ARS
## 5 202006 GBA Vicente López 1 36 27 19000 ARS
## 6 202006 GBA La Matanza 2 24 24 12000 ARS
## title property_type operation_type lat
## 1 Departamento - Flores Departamento Alquiler -34.61917
## 2 Retasado! Monoambiente en Nuñez, excelente ubicación! Departamento Alquiler -34.55460
## 3 Departamento - Belgrano Departamento Alquiler -34.56318
## 4 Monoambiente con cochera. Zencity. Puerto Madero Departamento Alquiler -34.61836
## 5 Alquiler TORRE dpto de 1o2 ambientes - excelente luz y vista cochera optativa Departamento Alquiler -34.53344
## 6 PH - Lomas Del Mirador PH Alquiler -34.66253
## lon
## 1 -58.46222
## 2 -58.46652
## 3 -58.46461
## 4 -58.36090
## 5 -58.49345
## 6 -58.52914
2.6 Resumir y agrupar datos
Esta función es súper útil cuando manipulamos datos ya que nos permitirá realizar resumenes/sumarios de la data completa, obteniendo por ejemplo valores promedio, máximos o mínimos de una o más columnas.
Probemos calculando la mediana de todos los valores que aparecen en la columna surface_covered:
summarise(datos_amba, surface_covered=median(surface_covered))
## surface_covered
## 1 66
O calculemos un promedio de toda la columna surface_total:
summarise(datos_amba, surface_covered=mean(surface_covered))
## surface_covered
## 1 91.98151
También podemos averiguar el valor máximo o mínimo de alguna variable:
summarise(datos_amba, surface_covered=max(rooms))
## surface_covered
## 1 10
summarise(datos_amba, surface_covered=min(rooms))
## surface_covered
## 1 1
Como verán, esta función resulta útil para ver valores agregados de toda la base, sin embargo, también podemos agrupar los datos previo a calular los resumenes, y así obtener resumenes por agrupaciones en vez de uno solo para toda la base. Para esto vamos a utilizar summarise()
junto a group_by()
. Veamos un ejemplo:
Primero agrupemos los datos por la variable “operation_type”.
Luego calculemos el promedio de superficie cubierta sobre la agrupación realizada previamente.
<- group_by(datos_amba, operation_type)
agrupar
<- summarise(agrupar, surface_covered=mean(surface_covered))
resumir
head(resumir)
## # A tibble: 2 x 2
## operation_type surface_covered
## <fct> <dbl>
## 1 Alquiler 72.9
## 2 Venta 97.3
Con la agrupación y el resumen podemos ver que la superficie cubierta promedio de las propiedades en alquiler es 72,93m2 y la de las propiedades en venta es 97,28m2.
Probemos agrupando por 3 columnas:
<- group_by(datos_amba, operation_type, currency)
agrupar
<- summarise(agrupar, price_m2=mean(price/surface_covered))
resumir
head(resumir)
## # A tibble: 2 x 3
## # Groups: operation_type [2]
## operation_type currency price_m2
## <fct> <fct> <dbl>
## 1 Alquiler ARS 520.
## 2 Venta USD 2689.
El valor del m2 promedio para las propiedades en Alquiler es de 520 $ARS mientras que para las propiedaes en venta es de 2.689 USD. Sin embargo, está claro que en el valor de CABA y GBA es diferente, así que calculemos el valor del m2 promedio para cada uno:
<- group_by(datos_amba, operation_type, currency, provincia)
agrupar
<- summarise(agrupar, rooms=mean(price/surface_covered))
resumir
head(resumir)
## # A tibble: 4 x 4
## # Groups: operation_type, currency [2]
## operation_type currency provincia rooms
## <fct> <fct> <fct> <dbl>
## 1 Alquiler ARS CABA 617.
## 2 Alquiler ARS GBA 399.
## 3 Venta USD CABA 3119.
## 4 Venta USD GBA 2024.
Se ve claramente que hay una diferencia entre CABA y GBA, siendo CABA más caro para ambos tipos de operación. Por último probemos desagregando esta información por partido:
<- group_by(datos_amba, operation_type, currency, partido)
agrupar
<- summarise(agrupar, price_m2=mean(price/surface_covered))
resumir
head(resumir)
## # A tibble: 6 x 4
## # Groups: operation_type, currency [1]
## operation_type currency partido price_m2
## <fct> <fct> <fct> <dbl>
## 1 Alquiler ARS Almirante Brown 304.
## 2 Alquiler ARS Avellaneda 299.
## 3 Alquiler ARS Berazategui 311.
## 4 Alquiler ARS Comuna 1 699.
## 5 Alquiler ARS Comuna 10 381.
## 6 Alquiler ARS Comuna 11 444.
2.7 Concatenar funciones (%>%)
Llegamos al final de la clase, ya vimos varias funciones por separado, pero ¿Qué pasa si queremos aplicarlas todas a la vez? ¿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 algunos ejemplos:
Imaginemos que queremos calcular por mes y para cada provincia (CABA y GBA) cuantas propiedades hubo en venta, con que valor total promedio, con que valor del m2 promedio y con que superficie promedio. Así lo tenemos que hacer según lo aprendido hasta ahora:
<- filter(datos_amba, operation_type=="Venta")
concatenar
<- select(concatenar, created_on, provincia, surface_covered, price)
concatenar
<- group_by(concatenar, created_on, provincia)
concatenar
<- summarise(concatenar, cantidad=n(),
concatenar price=mean(price),
surface_covered=mean(surface_covered),
price_m2=price/surface_covered)
head(concatenar)
## # A tibble: 4 x 6
## # Groups: created_on [2]
## created_on provincia cantidad price surface_covered price_m2
## <int> <fct> <int> <dbl> <dbl> <dbl>
## 1 202006 CABA 3986 291547. 85.3 3420.
## 2 202006 GBA 2772 231074. 121. 1903.
## 3 202007 CABA 3110 251563. 80.5 3124.
## 4 202007 GBA 1810 206180. 116. 1783.
Y así lo deberíamos hacer con pipe %>%:
<- datos_amba %>%
concatenar filter(operation_type=="Venta") %>%
select(created_on, provincia, surface_covered, price) %>%
group_by(created_on, provincia) %>%
summarise(cantidad=n(),
price=mean(price),
surface_covered=mean(surface_covered),
price_m2=price/surface_covered)
head(concatenar)
## # A tibble: 4 x 6
## # Groups: created_on [2]
## created_on provincia cantidad price surface_covered price_m2
## <int> <fct> <int> <dbl> <dbl> <dbl>
## 1 202006 CABA 3986 291547. 85.3 3420.
## 2 202006 GBA 2772 231074. 121. 1903.
## 3 202007 CABA 3110 251563. 80.5 3124.
## 4 202007 GBA 1810 206180. 116. 1783.
A partir de la agrupación y resumen por ejemplo podemos ver que:
- En ambos meses, en CABA hubo mayor cantidad de propiedades en venta.
- En ambos meses, la superficie cubierta de las propiedades en venta en GBA son mayores que las de CABA.
- En ambos meses el valor promedio del m2 es más alto en CABA que ne GBA.
- En ambas zonas (CABA y GBA), entre Junio y Julio 2020 hubo una caída en la cantidad de propiedades publicadas y en el valor promedio del m2.
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.
2.8 Transformar la estructura de los datos
El paquete tidyverse
también nos permite realizar transformaciones en la estructura de nuestro dataset. Pero, ¿A qué nos referimos con esto? A continuación analizaremos 2 casos:
Tipo 1. Nuestro dataset tiene diferentes categorías que están separadas en muchas filas. Por ejemplo:
Tipo 2. Nuestro dataset tiene diferentes categorías que están separadas en muchas columnas. Por ejemplo:
Como verán, en ambos casos la información es la misma, lo que cambia es la estructura.
Es muy probable que al analizar bases de datos nos encontramos con algunas estructuras similares a estas y querramos cambiarlas. Para pasar del Tipo 1 de estructura al Tipo 2 y viceversa utilizaremos las funciones spread()
y gather()
respectivamente.
Sigamos utilizando nuestro dataset de Properati, pero para trabajar con menos volumen de datos y que sea más sencillo comprender el ejemplo, hagamos una agrupación por provincia y tipo de operación y calculemos el valor del m2:
<- datos_amba %>%
transformar group_by(provincia, operation_type) %>%
summarise(valor_m2=mean(price/surface_covered))
head(transformar)
## # A tibble: 4 x 3
## # Groups: provincia [2]
## provincia operation_type valor_m2
## <fct> <fct> <dbl>
## 1 CABA Alquiler 617.
## 2 CABA Venta 3119.
## 3 GBA Alquiler 399.
## 4 GBA Venta 2024.
Bien, ya tenemos un pequeño dataset de 3 columnas y 4 filas que presentan una estructura similar a la que se muestra al inicio como “Tipo 1”.
2.8.1 Extender la estructura de los datos: spread()
Si necesitamos pasar el dataset al otro formato extendido, debemos usar spread()
indicando el dataset que quiero modificar (datos_amba), la columna que quiero separar (key=operation_type) y la columna que contiene lo valores que quiero mantener en la tabla (value=valor_m2):
<- spread(transformar, key=operation_type, value=valor_m2) extender
El resultado es el siguiente:
head(extender)
## # A tibble: 2 x 3
## # Groups: provincia [2]
## provincia Alquiler Venta
## <fct> <dbl> <dbl>
## 1 CABA 617. 3119.
## 2 GBA 399. 2024.
Se ve como ahora tenemos un dataset extendido, donde las categorías incluidas en columna operation_type se dividieron en 2 columnas: “Alquiler” y “Venta”. Pero, ¿Cómo hacemos si queremos volver al dataset original?
Esto lo hacemos con la función gather()
.
2.8.2 Unificar los datos: gather()
Esta función que une múltiples columnas en una sola, se suele utilizar cuando todas las columnas representan valores de una variable. Por ejemplo, en nuestro caso, tanto “Alquiler” como “Venta” pueden ser categorías de una variable llamada operation_type.
Para utilizar gather()
debemos indicar el dataset que queremos modificar (datos_amba), la nueva columna donde queremos agrupar múltiples columnas (key=“operation_type”), la nueva columna donde queremos agrupar los valores de toda la tabla (value=“valor_m2”), y por último debemos indicar que rango de columnas son las que queremos incluir en la key (Alquiler:Venta).
<- gather(extender, key="operation_type", value="valor_m2", Alquiler:Venta) unificar
head(unificar)
## # A tibble: 4 x 3
## # Groups: provincia [2]
## provincia operation_type valor_m2
## <fct> <chr> <dbl>
## 1 CABA Alquiler 617.
## 2 GBA Alquiler 399.
## 3 CABA Venta 3119.
## 4 GBA Venta 2024.
Y ahora si, volvimos al otro formato de tabla.