6.3 Limpieza y reestructura

La mayor parte de las bases de datos en estadística tienen forma rectangular por lo que únicamente se trataran este tipo de estructura de datos.

Una base de datos es una colección de valores numéricos o categóricos con tres características:

  • Cada valor pertenece a una variable y a una observación.

  • Una variable contiene los valores del atributo (genero, fabricante, ingreso) de la variable por unidad.

  • Una observación contiene todos los valores medidos por la misma unidad (personas, día, autos, municipios) para diferentes atributos.

6.3.1 Principios de datos limpios

Los principios de datos limpios Tidy Data de Hadley Wickham proveen una manera estándar de organizar la información:

  1. Cada variable forma una columna.
  2. Cada observación forma un renglón.
  3. Cada tipo de unidad observacional forma una tabla.


Ejemplos

Supongamos un experimento con 3 pacientes cada uno tiene resultados de dos tratamientos (A y B):

tratamientoA tratamientoB
Juan Aguirre - 2
Ana Bernal 16 11
José López 3 1


La tabla anterior también se puede estructurar de la siguiente manera:

Juan Aguirre Ana Bernal José López
tratamientoA - 16 3
tratamientoB 2 11 1


Entonces, siguiendo los principios de datos limpios obtenemos la siguiente estructura:

nombre tratamiento resultado
Juan Aguirre a -
Ana Bernal a 16
José López a 3
Juan Aguirre b 2
Ana Bernal b 11
José López b 1



6.3.2 Problemas más comunes

Algunos de los problemas más comunes en las bases de datos que no están limpias son:

  1. Los encabezados de las columnas son valores y no nombres de variables.
  2. Más de una variable por columna.
  3. Las variables están organizadas tanto en filas como en columnas.
  4. Más de un tipo de observación en una tabla.
  5. Una misma unidad observacional está almacenada en múltiples tablas.



6.3.3 Funciones de reestructura

Existe cuatro funciones principales para la manipulación de los datos.

Funciones principales:

  • gather()
  • spread()
  • unite()
  • separate()

Para entender los conceptos se presentan varios ejemplos usando la base de datos siguiente.

df.ejem <- data_frame(
  mes = c("1_ene", "2_feb", "3_mar", "4_abr", "5_may"),
  `2005`= c(8.6, 9.1, 8.7, 8.4, 8.5),
  `2006`= c(8.5, 8.5, 9.1, 8.6, 7.9),
  `2007`= c(9.0, 10.7, 20.0, 21, 16.2))
df.ejem
## # A tibble: 5 x 4
##     mes `2005` `2006` `2007`
##   <chr>  <dbl>  <dbl>  <dbl>
## 1 1_ene    8.6    8.5    9.0
## 2 2_feb    9.1    8.5   10.7
## 3 3_mar    8.7    9.1   20.0
## 4 4_abr    8.4    8.6   21.0
## 5 5_may    8.5    7.9   16.2


  • gather(): junta columnas en renglones.

También se le conoce como melt o derretir la base. Recibe múltiples columnas y las junta en pares de nombres y valores, convierte los datos anchos en largos.

tidyr::gather(data, key = name_variablelabel, value = name_valuelabel, select_columns)

df.ejem.long <- df.ejem %>% 
  gather(key = year, value = tasa, `2005`:`2007`)
# vemos las primeras líneas de nuestros datos alargados 
df.ejem.long %>% head
## # A tibble: 6 x 3
##     mes  year  tasa
##   <chr> <chr> <dbl>
## 1 1_ene  2005   8.6
## 2 2_feb  2005   9.1
## 3 3_mar  2005   8.7
## 4 4_abr  2005   8.4
## 5 5_may  2005   8.5
## 6 1_ene  2006   8.5


  • spread(): separa renglones en columnas.

Recibe dos columnas y las separa, haciendo los datos más anchos.

tidyr::spread(data, key = name_variablelabel, value = name_valuelabel)

df.ejem.spread <- df.ejem.long %>% 
  tidyr::spread(mes, tasa)
df.ejem.spread %>% head
## # A tibble: 3 x 6
##    year `1_ene` `2_feb` `3_mar` `4_abr` `5_may`
##   <chr>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
## 1  2005     8.6     9.1     8.7     8.4     8.5
## 2  2006     8.5     8.5     9.1     8.6     7.9
## 3  2007     9.0    10.7    20.0    21.0    16.2


  • unite(): une varias columnas en una sola.

tidyr::unite(data, col = name_variabletoadd, c(columns to unite), sep)

df.ejem.unite <- df.ejem.long %>% 
  unite(col = month_year, c(mes, year), sep = "_")
df.ejem.unite %>% head
## # A tibble: 6 x 2
##   month_year  tasa
##        <chr> <dbl>
## 1 1_ene_2005   8.6
## 2 2_feb_2005   9.1
## 3 3_mar_2005   8.7
## 4 4_abr_2005   8.4
## 5 5_may_2005   8.5
## 6 1_ene_2006   8.5


  • separate(): separa una columna en varias columnas.

tidyr::separate(data, col = name_variabletoseparate, into = c(vector with names using ""), sep)

df.ejem.separate <- df.ejem.unite %>% 
  separate(col = month_year, c('mes.num', 'mes', 'year'), sep = "_")
df.ejem.separate %>% head
## # A tibble: 6 x 4
##   mes.num   mes  year  tasa
##     <chr> <chr> <chr> <dbl>
## 1       1   ene  2005   8.6
## 2       2   feb  2005   9.1
## 3       3   mar  2005   8.7
## 4       4   abr  2005   8.4
## 5       5   may  2005   8.5
## 6       1   ene  2006   8.5

Otras funciones útiles:

  • arrange(): ordena un dataframe de acuerdo a variables específicas.
  • rename(): permite renombrar variables.
  • select(): selecciona variables.