¿Cómo modificamos la estructura de un dataset?

El paquete tidyverse incluye diversos paquetes, entre los que se encuentra tidyr, que nos permite realizar transformaciones en la estructura de un dataset. 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.

Antes de comenzar, lo primero que debemos hacer es activar nuestra librería tidyverse:

library(tidyverse)

Ahora carguemos nuestro dataset de datos de Properati:

datos_amba <- read.csv("data/amba_properati.csv")

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 <- datos_amba %>%
  group_by(provincia, operation_type) %>%
  summarise(valor_m2=mean(price/surface_covered))
head(datos_amba)
## # 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”.

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):

datos_amba <- spread(datos_amba, key=operation_type, value=valor_m2)

El resultado es el siguiente:

head(datos_amba)
## # 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().

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).

datos_amba <- gather(datos_amba, key="operation_type", value="valor_m2", Alquiler:Venta)
head(datos_amba)
## # 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.