Antes de analizar datos, tenemos que estructurarlos correctamente. Aunque esto podemos hacerlo en hojas de cálculo, en R podemos estructurarlos de forma más rápida y con menos posibilidad de error. A continuación algunas funciones útiles, que nos pueden facilitar el trabajo con datos. Para los ejemplos, se utilizan bases de datos de resultados electorales en Costa Rica, disponibles en el sitio: Atlas Electoral digital de Costa Rica

Además vamos a usar los siguientes paquetes, comunes para el manejo de datos:

library(plyr)
library(dplyr)
library(readr)
library(tidyr)

También se puede consultar el siguiente tutorial: Limpieza de datos, para recordar algunos comandos de dplyr como el %>%.

Unir varias bases de datos

Cuando trabajamos con datos históricos y queremos tener todos los datos en una misma base de datos, podemos unirla de forma muy fácil haciendo uso de las listas list(). Primero debemos crear un objeto lista que guarde diferentes bases de datos. Luego, con la función join_all del paquete plyr las unimos todas.

¿Qué se necesita para unir dos bases de datos?

Tenemos que tener una variable en común entre las diferentes bases de datos. ¿Cómo es el comando?: nombre_objeto <- join_all(nombre_lista, by=c("variable en común"), type=""), donde:

Para el ejemplo, supongamos que la variable en común entre las bases de datos se llama id, y que nuestras bases de datos se llaman base1, base2, base3, base4. Además vamos a unir todos los datos.

El código sería así:

nombre_lista<-list(base1, base2, base3, base4)
resultados <-join_all(nombre_lista, by=c("id"), type="full")

Seleccionar

Para seleccionar variables específicas usamos el comando select() de dplyr. Es tan sencillo como enlistar las variables que queremos seleccionar. Si queremos excluir una variable le ponemos el signo - antes, por ejemplo -var1. También podemos hacer uso de estos operadores:

Operador Descripción
starts_with() Si la variable comienza con algún caracter específico, por ejemplo starts_with(“p”)
ends_with() Si la variable termina con algún caracter específico
contains() Si la variable contiene algún caracter específico
everything() Todas las variables

Filtrar

Para filtrar usamos la función filter() de dplyr La sintaxis es simple: filter(base, condicion). Donde condición es la condión lógica por la que queremos filtrar datos. Para ello usamos operadores lógicos:

Calcular la misma función a muchas variables a la vez

Para este ejemplo vamos a utilizar una base de datos que contiene todos los resultados de las elecciones nacionales en Costa Rica de 2014. Los datos vienes desagregados por distrito y además incluye la votación para presidente y diputados. El análisis queremos hacerlo por cantón. Como resultado final queremos obtener una base de datos que contenga:

Lo primero es cargar la base de datos que se encuentra en este enlace resultados2014.csv:

resultados14<-read_csv("https://raw.githubusercontent.com/Camilamila/datajournalism/master/data/resultados2014.csv") 

Esta base de datos contiene 519 observaciones y 50 variables. Ahora vamos a ir paso a paso haciendo las transformaciones señalas arriba:

¿Cómo funciona sumarise_at y sumarise_all?
Esta función nos permite aplicar la misma función a varias varaibles a la vez. La sintaxis es la siguiente:
summarise_at(vars(), funcion), donde en vars(), agregamos la lista de variables a las que les vamos a aplicar la función; y en función ponemos la función que queremos aplicar, por ejemplo sum, mean, median. En este caso la sintaxis sería:
summarise_at(vars(starts_with("p")), sum, na.rm=T ), que significa que a todas las variables que comiencen con p, se les va a aplicar la suma. El argumento na.rm=T es muy importante ponerlo cuando tenemos celdas en blanco.

summarise_all, podemos utilizarla cuando le vamos a aplicar la función a todas las variables, excepto a aquellas por las que estamos agrupando (cantón). En este caso, solamente es necesario poner la función, no es necesario especificar las variables

Podemos unir todos los pasos anteriores en el siguiente código:

resultados_presidente<- resultados14 %>%
  select(starts_with("p"), -pccdd, -contains("pnulos"), -contains("pblan"), -contains("recib"), -contains("pabs")) %>%
  filter(p<8) %>%
  group_by(pcc, p)%>%
  summarise_all(sum, na.rm=T )

##Este código daría el mismo resultado
resultados_presidente<- resultados14 %>%
  select(starts_with("p"), -pccdd, -contains("pnulos"), -contains("pblan"), -contains("recib"), -contains("pabs")) %>%
  filter(p<8) %>%
  group_by(pcc, p)%>%
  summarise_at(vars(starts_with("p")), sum, na.rm=T )

head(resultados_presidente)
## # A tibble: 6 x 16
## # Groups:   pcc [6]
##     pcc     p pvalid14 ppase14 ppac14 ppan14 pde_los_trabajadores14 pfa14
##   <int> <int>    <int>   <int>  <int>  <int>                  <int> <int>
## 1   101     1   155226     682  53830    428                    279 23528
## 2   102     1    31285     150  10490     53                     69  3314
## 3   103     1   104722     557  37446    221                    227 16785
## 4   104     1    18544      77   5445     35                     42  2880
## 5   105     1     7336      43   1976     24                     16  1594
## 6   106     1    27278     201   8409     81                     56  4841
## # ... with 8 more variables: ppin14 <int>, ppln14 <int>, pml14 <int>,
## #   ppng14 <int>, pppn14 <int>, pprc14 <int>, pprn14 <int>, ppusc14 <int>

Calcular muchos porcentajes a la vez

Si quisieramos calcular el porcentaje de votos por cantón para cada partido, necesitamos: el total de votos de cada partido y la cantidad de votos válidos para ese cantón. Esos datos ya los tenemos en la base de datos. Si queremos hacerlo para todos los partidos, lo podemos hacer con la función mutate_all(), que es similar a summarise_all(), con la diferencia de que summarise, elimina de la base las variables a las cuales no les aplica la transformación. Si solamente queremos aplicarla a ciertas variables, usamos mutate_at

Lo importante es especificar la función que queremos aplicar. En el ejemplo anterior la función era sum, pero en este caso es un porcentaje. Entonces la función sería:

funs((./votosvalidos)*100) Es decir, el . significa que va a tomar el valor de una varaible, lo va a dividir entre los votos válidos y luego el resultado se multiplica por 100.

NOTA: Algo importante es que la variable de los votos válidos (que en nuestro caso se llama pvalid14) debe ser la última de la base de datos.

Entonces, la función sería (se puede usar cualquiera)

mutate_all(funs((. / pvalid14)*100))
summarise_all(funs((. / pvalid14)*100))
mutate_at(vars(nombre de las variables), funs((. / pvalid14)*100))

¿Cómo lo hacemos en un solo bloque de código?

resultados_porcentaje<- resultados_presidente %>%
  select(-pvalid14, everything()) %>%   #Con esto, llevamos la variable pvalid14 al final
  group_by(pcc, p)%>%  #agrupamos por cantón y provincia (para que no aplique la transformación a estas variables)
  summarise_all(funs((. / pvalid14)*100))

##Este código daría el mismo resultado
resultados_porcentaje<- resultados_presidente %>%
  select(-pvalid14, everything()) %>%  
  group_by(pcc, p)%>%
  mutate_all(funs((. / pvalid14)*100))

head(resultados_porcentaje)
## # A tibble: 6 x 16
## # Groups:   pcc, p [6]
##     pcc     p   ppase14   ppac14    ppan14 pde_los_trabajadores14    pfa14
##   <int> <int>     <dbl>    <dbl>     <dbl>                  <dbl>    <dbl>
## 1   101     1 0.4393594 34.67847 0.2757270              0.1797379 15.15725
## 2   102     1 0.4794630 33.53045 0.1694103              0.2205530 10.59294
## 3   103     1 0.5318844 35.75753 0.2110349              0.2167644 16.02815
## 4   104     1 0.4152286 29.36260 0.1887403              0.2264884 15.53063
## 5   105     1 0.5861505 26.93566 0.3271538              0.2181025 21.72846
## 6   106     1 0.7368575 30.82704 0.2969426              0.2052936 17.74690
## # ... with 9 more variables: ppin14 <dbl>, ppln14 <dbl>, pml14 <dbl>,
## #   ppng14 <dbl>, pppn14 <dbl>, pprc14 <dbl>, pprn14 <dbl>, ppusc14 <dbl>,
## #   pvalid14 <dbl>

Renombrar variables de una base de datos

Podemos hacerlo con la función names(). Por ejemplo supongamos que tenemos una base que se llama base1 y queremos renombrar la variable ppac14 a pac, la sintaxis sería:

names(base1)[names(base1) == 'ppac14'] <- 'pac'