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/



Manipulación de datos con dplyr

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



Nuestros datos

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

Estructura de los datos

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

Codificar adecuadamente las variables categóricas

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

Trabajar los datos con dplyr

La 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

Filtrar

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
Población Región de Murcia (2000)
Poblacion
1149328

Ordenar

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
Población en los Municipios (2000)
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

Crear y añadir una variable calculada

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

Obtener cálculos

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
Medias poblacionales
Total Hombres Mujeres
34480.31 17234.75 17245.56

Gráfico de Líneas

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

Elaborar el gráfico paso a paso

  1. 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”.

  2. Ir añadiendo las líneas de cada población: lines( )

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

:)