dplyr%>%FUENTE: Toda la información usada en este tutorial corresponde al equipo 00RTeam de la Universidad de Murcia y está disponible en http://gauss.inf.um.es/
dplyrLa librería dplyr permite manipular y hacer cálculos sobre un data frame mediante una única expresión: vamos encadenando funciones con el operador %>%. Esta sintaxis o forma de codificar se llama pipe o de tubería.
Las funciones de esta librería son:
select( ) para seleccionar columnas (variables),
filter( ) para seleccionar filas (observaciones),
mutate( ) para crear nuevas variables,
summarise( ) para cálculos estadísticos y otras operaciones,
group_by( ) usada conjuntamente con summarise( ),
arrange( ) para reordenar filas.
La sintaxis the pipe, de tuberías, permite expresar de forma clara una secuencia de múltiples operaciones. Es una sintaxis en cadena, de forma que el operador %> % coge el output (‘la salida’) de una sentencia de código y la convierte en el input (‘el argumento’) de una nueva sentencia.
Al describir el código ponemos pensar en él como un “ENTONCES”.
La salida (resultado) del código a la izquierda de%>% es argumento de la función de la derecha.
Leer el fichero de datos pobMur15.csv y asignarlo al objeto df.
df <- read.table( file = "pobMur15.csv",
header = TRUE,
sep = ";",
dec = ".",
encoding = "UTF-8",
stringsAsFactors = FALSE )
Comprobar que se ha leido bien con la funcion head( ).
head( df )
## codMun Mun year pobHom pobMuj
## 1 1 Abanilla 2000 3050 3056
## 2 1 Abanilla 2001 3030 3003
## 3 1 Abanilla 2002 3045 2995
## 4 1 Abanilla 2003 3151 3088
## 5 1 Abanilla 2004 3084 3061
## 6 1 Abanilla 2005 3171 3094
Para examinar la estructura de los datos que contiene el fichero pobMur15.csv se usa la función str(). Nuestro archivo es un data frame, que contiene 720 registros, de 5 variables: codMun, Mun, year, pobHom, pobMuj. Nos indica la naturaleza de los valores de cada variable: int si son números enteros “integer” (numérico), chr si son cadena “character” (alfanumérico).
str( df )
## 'data.frame': 720 obs. of 5 variables:
## $ codMun: int 1 1 1 1 1 1 1 1 1 1 ...
## $ Mun : chr "Abanilla" "Abanilla" "Abanilla" "Abanilla" ...
## $ year : int 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 ...
## $ pobHom: int 3050 3030 3045 3151 3084 3171 3212 3350 3390 3315 ...
## $ pobMuj: int 3056 3003 2995 3088 3061 3094 3121 3218 3252 3274 ...
Las variables codMun y Mun podemos considerarlas categóricas. Ahora están en formato int y chr, por lo que hay que codificarlas. Las transformamos a factor, de forma que R reconozca sus valores como niveles de una variable categórica. Con la función as.factor():
df$codMun <- as.factor( df$codMun ) # transformación de los datos a factor
df$Mun <- as.factor( df$Mun ) # transformación de los datos a factor
str( df ) # comprobar que ahora son factor
## 'data.frame': 720 obs. of 5 variables:
## $ codMun: Factor w/ 45 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ Mun : Factor w/ 45 levels "Abanilla","Abarán",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ year : int 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 ...
## $ pobHom: int 3050 3030 3045 3151 3084 3171 3212 3350 3390 3315 ...
## $ pobMuj: int 3056 3003 2995 3088 3061 3094 3121 3218 3252 3274 ...
dplyrLa librería dplyr permite manipular y hacer cálculos sobre un data frame mediante una única expresión: vamos encadenando funciones con el operador %>%. Esta sintaxis o forma de codificar se llama pipe o de tubería.
library( dplyr ) # Manipulación de data frames
NOTA: Presentaremos los resultados en una tabla atractiva, mediante la función kable() de la librería knitr.
library( knitr ) # Presentación de tablas
Selecciona de df la información correspondiente al año 2000 (todos los registros para ese año). Utilízala para calcular la población total de la Región de Murcia.
df %>% # del data frame completo
filter( year == 2000 ) %>% # selecciona los registros del año 2000
summarise( Poblacion = sum( pobHom, pobMuj ) ) %>% # suma todos los datos de las dos variables
kable( caption = "Población Región de Murcia (2000)" ) # mostrar el resultado en una tabla
| Poblacion |
|---|
| 1149328 |
Calcular la población total en cada municipio para el año 2000, y presentar los municipios ordenados de mayor a menor según el número de habitantes (orden descendente):
df %>% # del data frame completo
group_by( Mun ) %>% # para cada municipio
filter( year == 2000 ) %>% # selecciona los registros del año 2000
summarise( Poblacion = sum( pobHom, pobMuj ) ) %>% # suma todos los datos de las dos variables
arrange( desc(Poblacion) ) %>% # en orden descendente por la Población
kable( caption = "Población en los Municipios (2000)" ) # mostrar el resultado en una tabla
| Mun | Poblacion |
|---|---|
| Murcia | 357166 |
| Cartagena | 179939 |
| Lorca | 72000 |
| Molina de Segura | 44389 |
| Alcantarilla | 33453 |
| Cieza | 32126 |
| Yecla | 29319 |
| Águilas | 27559 |
| Torre-Pacheco | 22719 |
| Totana | 22359 |
| Caravaca de la Cruz | 22250 |
| Jumilla | 20854 |
| San Javier | 18925 |
| Mazarrón | 18847 |
| Las Torres de Cotillas | 16003 |
| Alhama de Murcia | 15856 |
| San Pedro del Pinatar | 15583 |
| La Unión | 14606 |
| Archena | 14516 |
| Cehegín | 14171 |
| Mula | 13738 |
| Abarán | 12241 |
| Santomera | 10972 |
| Puerto Lumbreras | 10859 |
| Bullas | 10753 |
| Fuente Álamo de Murcia | 10140 |
| Calasparra | 8888 |
| Moratalla | 8460 |
| Beniel | 8116 |
| Los Alcázares | 7513 |
| Ceutí | 7305 |
| Alguazas | 7052 |
| Fortuna | 6814 |
| Abanilla | 6106 |
| Blanca | 5749 |
| Lorquí | 5562 |
| Librilla | 3908 |
| Pliego | 3409 |
| Campos del Río | 2035 |
| Ricote | 1582 |
| Villanueva del Río Segura | 1568 |
| Albudeite | 1369 |
| Aledo | 997 |
| Ulea | 959 |
| Ojós | 593 |
Calcula ahora, para cada año y municipio, la población total (mujeres + hombres) y guárdalo pobTotal, variable que debes añadir a df.
df <- # para guardar la nueva variable, se 'asigna' al df
df %>% # del data frame completo
mutate( pobTotal = pobHom + pobMuj ) # crea una nueva variable pobTotal que sea la suma de hombres y mujeres
head( df ) # comprobar que se ha añadido la nueva variable
## codMun Mun year pobHom pobMuj pobTotal
## 1 1 Abanilla 2000 3050 3056 6106
## 2 1 Abanilla 2001 3030 3003 6033
## 3 1 Abanilla 2002 3045 2995 6040
## 4 1 Abanilla 2003 3151 3088 6239
## 5 1 Abanilla 2004 3084 3061 6145
## 6 1 Abanilla 2005 3171 3094 6265
Filtra a partir de df la información correspondiente a un municipio, el que prefieras, y calcula la media de las 3 poblaciones (total, hombres y mujeres).
Primero veo qué poblaciones tiene df:
table ( df$Mun )
Seleccionar el municipio de Cieza (me gustan los melocotones), y calcular sus medias poblacionales:
df %>% # del data frame completo
filter( Mun == "Cieza" ) %>% # filtra por Cieza
summarise( Total = mean(pobTotal), Hombres = mean(pobHom), Mujeres = mean(pobMuj) ) %>% # haz la media de esas variables
kable( caption = "Medias poblacionales", digits = 2 ) # presenta el resultado en una tabla
| Total | Hombres | Mujeres |
|---|---|---|
| 34480.31 | 17234.75 | 17245.56 |
Con los datos del municipio seleccionado elabora un gráfico de líneas para las poblaciones total, de hombres y de mujeres.
Primero crear un df solo del municipio de Cieza. Le asigno <- el nombre de dfCieza y lo guardo (ya que lo usaré para crear el gráfico):
dfCieza <- # crear dfCieza
df %>% # del data frame completo
filter( Mun == "Cieza" ) # filtra por Cieza
Antes de crear el gráfico, ver entre qué valores varían mis datos (lo usaré de guía para dibujar las dimensiones del gráfico):
apply( dfCieza[ ,4:6], 2, summary )
## pobHom pobMuj pobTotal
## Min. 15752.00 16374.00 32126.00
## 1st Qu. 16829.75 16964.25 33794.00
## Median 17584.00 17397.00 34981.00
## Mean 17234.75 17245.56 34480.31
## 3rd Qu. 17668.50 17541.50 35210.00
## Max. 17775.00 17670.00 35425.00
Crear el gráfico plot( ), vacio type = "n" , con los ejes con escalas que me interesan: dimensiones del gráfico c( ), en el que indico los valores mínimo y máximo en los que varían mis datos. Se amplía un poco más el rango para que visualmente el gráfico “respire”.
Ir añadiendo las líneas de cada población: lines( )
Por último, incluir una leyenda: legend( )
# Dibujar el Gráfico sin datos, solo el diseño.
# En plot( ) hay que indicar las variables en los ejes, aunque no los dibuje en este plot (type = "n").
plot( dfCieza$year, dfCieza$pobTotal, # indicar variables en los ejes
xlim = c(1999,2016), # límites eje x (los años)
ylim = c(-1,37000), # límites eje y (los habitantes)
type = "n", # gráfico vacio
xlab = "Año", # etiqueta para el eje x
ylab = "Número de habitantes", # etiqueta para el eje y
main = "Población de Cieza" ) # título principal del gráfico
# Dibujar la línea para Poblacion total
lines( dfCieza$year, dfCieza$pobTotal,
lwd = 3, # grosor de la línea
lty = 1, # linea continua
col = "black" ) # color de la línea
# Dibujar la línea para Poblacion de hombres
lines( dfCieza$year, dfCieza$pobHom,
lwd = 1.5, # grosor de la línea
lty = 1, # linea continua
col = "blue" ) # color de la línea
# Dibujar la línea para Poblacion de mujeres
lines( dfCieza$year, dfCieza$pobMuj,
lwd = 1.5, # grosor de la línea
lty = 3, # linea de puntos
col = "blue" ) # color de la línea
# Leyenda
legend( "bottomright", # posición en el gráfico
cex = 0.9, # tamaño
c( "Total", "Hombres", "Mujeres" ), # etiquetas (en orden)
col = c("black", "blue", "blue"), # colores de las líneas (en orden)
fill = c("black", "blue", "blue"), # colores de los box (en orden)
lwd = c(3, 1.5, 1.5),
lty = c(1, 1, 3),
title = "Poblaciones" )
:)