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 %>%
.
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:
by
: aquí se incluye, la o las variables por las que se va a unir. Si son varias se separan por coma, por ejemplo: by=c("id1", "id2")
.type
: se elige el tipo de unión: left, right o full. full
une todos los datos.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")
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 |
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:
>
: mayor que<
: menor que>=
: mayor o igual que<=
: menor o igual que==
: igual que (se ponen dos signos de igual)!=
: diferente&
: y|
: ois.na(variable)
: filtra los valores en blanco de la variable seleccionada.!is.na(variable)
: filtra los valores que no están en blanco de la variable.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:
select
. Como todas esas variables comienzan con p, podemos usar el operador starts_with("p")
. No nos interesan ni los votos nulos, ni blancos, recibidos y el abstencionismo (para este ejemplo).filter(p<8)
.group_by(pcc, p)
. (pcc es el código de cantón y p el de la provincia)¿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>
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>
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'