Manipulación de datos en R

En esta presentación vamos a ver casos prácticos de manipulación de datos en R utilizando las bibliotecas que constituyen el tidyverse. No importa en qué formato estén los datos originales, el objetivo es llevarlos a un objeto de datos, data.frame o, preferiblemente tibble, que esté en forma ordenada (tidy).

Las herramientas básicas para trabajar con los datos están incluidas en los paquetes incluidos en tidyverse:

  • tibble para trabajar con datos de esa clase genérica,
  • tidyr para llevar los datos a una forma ordenada -que dependerá de cada aplicación-,
  • dplyr para cambiar los objetos de datos y para obtener resúmenes de los objetos de datos.

Lectura de datos

En general queremos importar datos en R en un formato data.frame o asociados (tibble), que permiten luego trabajar de forma fácil con ellos. Básicamente tenemos las siguientes alternativas:

Procedencia ¿Cómo leerlos? Ejemplo
Un paquete de R library(lib);data(df) data(cars)
Un fichero: Paquetes:
csv,fwf,txt readr read_table("data.txt")
SPSS,SAS,… haven read_sav("data.sav")
xls, xlsx readxl read_excel("data.xls",skip=10)
Cualquiera rio import("data.csv")
pcAxis (INE) pxR read.px("data.px")
Una página web: Paquetes:
Tablas html htmltab htmltab(url)
html rvest read_html(url)
JSON jsonlite fromJSON(url)

Además son útiles, para cargar desde una página web un fichero binario, download.file y para descomprimirlo unzip

Ejemplo 1: zip y xls: Carga de la base de datos del Anuario Económico de la Caixa

El Anuario Económico 2013 de La Caixa era una fuente de gran riqueza con datos municipales españoles. Aunque no está disponible ya en la página de La Caixa, si que lo podemos descargar de http://archive.org. Está en un fichero xls incluido en un fichero zip. Para cargar los datos en R, empezamos por guardar el fichero zip en nuestro ordenador (a mano o utilizando R), descomprimirlo (a mano o con R), y leerlo (con read_excel del paquete readxl). Para descargar el fichero podemos utilizar la función download.file, que tiene como primer argumento la url, y como segundo el nombre del fichero de destino. Después podemos descomprimirlo con unzip antes de leer el fichero xls.

library(readxl)
download.file("http://web.archive.org/web/20150507143432/http://www.anuarieco.lacaixa.comunicacions.com/java/X?cgi=_FILE&frame=x&file=/caixa/zip/AE13_Datos_estadisticos_municipales-provinciales_xlsx.zip", destfile="CaixaAE13.zip", mode="wb")
unzip("CaixaAE13.zip")
AE13mun <-  read_excel("AE13_Municipal_Completo.xlsx",na="n.d.")

En la función read_excel hemos tenido que identificar el fichero, y especificar con que se corresponde en los datos originales el valor ausente, que en R se llama NA. Es una lástima que read_excel sólo permite un valor de código NA, cuando la fuente utiliza dos: n.s. y n.d.. Para ver los argumentos que admite la función read_excel, o cualquier otra función, tenemos que escribir

args(read_excel)
## function (path, sheet = 1, col_names = TRUE, col_types = NULL, 
##     na = "", skip = 0) 
## NULL

o si queremos la página de ayuda

help(read_excel)

Comprobamos que por defecto read_excel carga la primera hoja del fichero, asume que la primera fila son los nombres de las columnas, y que el tipo de datos de cada columna debe identificarlo la propia función. Muchas veces es útil especficar skip, para ignorar las primeras filas cuando los datos comienzan más abajo.

El resultado de read_excel es un tibble o tbl_df preparado para trabajar con dplyrde 3316 filas y 315 columnas. Una de las utilidades añadidas de los objetos de este tipo es que, cuando los imprimimos, no debemos temer que se nos inunde la consola con un objeto enorme, sino que por defecto muestra las primeras filas y las primeras columnas, y nos informa del resto. Podemos también ver la estructura con str pero sólo de las primeras columnas:

str(AE13mun)
## Classes 'tbl_df', 'tbl' and 'data.frame':    3316 obs. of  315 variables:
##  $ Nombre Municipio o Total Provincial y/o CC.AA.             : chr  "Abla" "Abrucena" "Adra" "Albox" ...
##  $ Código INE                                                 : chr  "04001" "04002" "04003" "04006" ...
##  $ Población  2012                                            : num  1465 1360 24626 10821 3847 ...
##  $ Población  2011                                            : num  1480 1391 24512 11091 3835 ...
##  $ Población  2010                                            : num  1463 1367 24512 11042 3824 ...
##  $ Población  2009                                            : num  1504 1341 24373 11178 3779 ...
##  $ Población  2008                                            : num  1503 1366 23880 11427 3724 ...
##  $ Población  2007                                            : num  1514 1379 23742 11166 3587 ...
##  $ Población  2006                                            : num  1505 1339 23545 11000 3522 ...
##  $ Población  2005                                            : num  1512 1358 23195 11271 3438 ...
##  $ Población  2004                                            : num  1482 1386 22257 10680 3319 ...
##  $ Población  2003                                            : num  1480 1391 21704 10409 3253 ...
##  $ Población  2002                                            : num  1529 1413 22034 9974 3241 ...
##  $ Población  2001                                            : num  1517 1437 21810 9661 3201 ...
##  $ Población  2000                                            : num  1516 1455 21505 9599 3165 ...
##  $ Población  1999                                            : num  1519 1460 21286 9671 3124 ...
##  $ Población  1998                                            : num  1516 1462 21016 9471 3111 ...
##  $ Población varones                                          : num  765 699 12493 5489 1961 ...
##  $ Población mujeres                                          : num  700 661 12133 5332 1886 ...
##  $ Población españoles                                        : num  1288 1251 21563 8080 3421 ...
##  $ Población extranjeros                                      : num  177 109 3063 2741 426 ...
##  $ Variación población 07-12 (Absoluta)                       : num  -49 -19 884 -345 260 ...
##  $ Variación población españoles 07-12 (absoluta)             : num  -121 -73 -41 -500 113 ...
##  $ Variación población extranjera 07-12 (absoluta)            : num  72 54 925 155 147 ...
##  $ Variación población 07-12 (%)                              : num  -3.2 -1.4 3.7 -3.1 7.2 2.6 2.1 27.8 19 17.7 ...
##  $ Variación población 96-01 (%)                              : num  -1.8 -2.9 5.2 3.6 3.1 -2.4 11.5 11.4 19.4 5.3 ...
##  $ Variación población 91-96 (%)                              : num  -8.1 2 3.9 -5.5 1.8 9.9 5.8 2 9.7 18.7 ...
##  $ Variación población 91-01 (%)                              : num  -9.7 -1 9.3 -2.1 4.9 7.2 17.9 13.7 31 24.9 ...
##  $ Ritmo de crecimiento medio anual de la población 07-12     : num  -0.7 -0.3 0.7 -0.6 1.4 0.5 0.4 5 3.5 3.3 ...
##  $ Ritmo de crecimiento medio anual de la población 96-01     : num  -0.4 -0.6 1 0.7 0.6 -0.5 2.2 2.2 3.6 1 ...
##  $ Ritmo de crecimiento medio anual de la población 91-96     : num  -1.7 0.4 0.8 -1.1 0.4 1.9 1.1 0.4 1.9 3.5 ...
##  $ Ritmo de crecimiento medio anual de la población 91-01     : num  -1 -0.1 0.9 -0.2 0.5 0.7 1.7 1.3 2.7 2.2 ...
##  $ Extensión (km2)                                            : num  45 84 90 168 26 296 99 66 47 17 ...
##  $ Paro registrado en % s/población potencialmente activa 2012: num  11.8 10.1 19.3 13.1 18.6 19.3 9.7 7 9.5 19.3 ...
##  $ Paro registrado en % s/población potencialmente activa 2011: num  9.6 7.5 18.8 11.7 14.5 17.5 8.5 5.4 8.3 18.1 ...
##  $ Paro registrado en % s/población potencialmente activa 2010: num  8.6 9 18.1 11.3 12.5 16.9 8.6 5.7 9.5 15.1 ...
##  $ Paro registrado en % s/población potencialmente activa 2009: num  7.3 6.9 15.3 9.4 11 14.7 8.5 4.6 6.7 12.2 ...
##  $ Paro registrado en % s/población potencialmente activa 2008: num  6.2 6 11 5.6 8.1 10.4 6.4 3.5 5.6 10.3 ...
##  $ Paro registrado en % s/población potencialmente activa 2007: num  5 4.1 8.4 4.5 6.1 8.4 4.6 2.2 3.2 7.7 ...
##  $ Paro registrado en % s/población potencialmente activa 2006: num  7 4.8 8.8 4.2 5.6 8.4 3.8 2.3 2.6 7 ...
##  $ Paro registrado en % s/población potencialmente activa 2005: num  6.1 5.4 8.1 3.7 7.2 7.3 4.2 2.2 2.6 6.7 ...
##  $ Paro registrado en % s/población potencialmente activa 2004: num  3 1.7 4.4 3.5 4.7 5.3 3.3 1.7 1.7 4.2 ...
##  $ Paro registrado en % s/población potencialmente activa 2003: num  4.3 3.6 4.2 3.5 4.4 5.8 3 3.4 2.4 5.2 ...
##  $ Paro registrado en % s/población potencialmente activa 2002: num  4.3 2.8 3.6 3.8 4.3 5.9 2 3.3 3.8 5.1 ...
##  $ Paro registrado en % s/población potencialmente activa 2001: num  2.9 2.4 4.3 4.4 4.8 5.8 3.2 4.1 4.9 4.9 ...
##  $ Paro registrado en % s/población potencialmente activa 2000: num  5.2 3.6 3.9 4.3 4.8 5.6 3.3 3.8 3.6 5.7 ...
##  $ Paro registrado en % s/población potencialmente activa 1999: num  4.8 3 3.4 4.6 5.3 5.6 3.7 3.6 4.4 5.4 ...
##  $ Paro registrado en % s/población potencialmente activa 1998: num  5 5 3.7 5.3 4.9 7 3.3 4.8 4.8 6.1 ...
##  $ Paro registrado en % s/población potencialmente activa 1997: num  4.7 6 4.1 5.7 5 7.6 4.3 6.1 4.2 6.6 ...
##  $ Paro registrado en % s/población potencialmente activa 1996: num  6.9 3.3 4.2 6.9 7.2 8.1 4.4 5.5 5.8 5.7 ...
##  $ % Paro de varones                                          : num  13.6 10.8 17.6 13.3 18.6 19.2 8.9 8.4 11.4 18 ...
##  $ % Paro de mujeres                                          : num  9.7 8.7 21.4 11.7 18.4 19.3 10.3 5.5 7.5 20.8 ...
##  $ % Paro de 16 a 24 años                                     : num  8.4 5 11.6 9.2 18.2 11.4 5.9 11.7 1.6 13.4 ...
##  $ % Paro de 25 a 49 años                                     : num  12.5 13.6 21.7 15.7 19.6 21.9 11.9 11.7 13.4 19.8 ...
##  $ % Paro de 50 a 64 años                                     : num  12.3 7.6 19.3 10.5 16.5 18.6 7.6 2.5 8.1 22.4 ...
##  $ Cuota de mercado  2012                                     : num  3 3 53 26 8 407 8 8 2 8 ...
##  $ Cuota de mercado  2011                                     : num  3 3 53 26 8 406 9 8 2 8 ...
##  $ Cuota de mercado  2010                                     : num  3 3 53 27 8 407 9 8 2 8 ...
##  $ Cuota de mercado  2009                                     : num  3 3 53 27 8 407 9 8 2 8 ...
##  $ Cuota de mercado  2008                                     : num  3 3 53 28 8 408 9 8 2 8 ...
##  $ Cuota de mercado  2007                                     : num  3 3 54 28 8 410 9 7 2 8 ...
##  $ Cuota de mercado  2006                                     : num  3 3 53 27 8 411 8 7 2 8 ...
##  $ Cuota de mercado  2005                                     : num  3 3 53 28 8 406 9 6 2 7 ...
##  $ Cuota de mercado  2004                                     : num  3 3 53 27 8 406 8 5 2 7 ...
##  $ Cuota de mercado  2003                                     : num  4 3 52 26 8 407 8 4 2 7 ...
##  $ Cuota de mercado  2002                                     : num  4 3 52 25 8 408 8 4 1 7 ...
##  $ Cuota de mercado  2001                                     : num  4 3 52 25 8 408 8 4 1 7 ...
##  $ Cuota de mercado  2000                                     : num  4 3 52 25 8 409 8 4 1 7 ...
##  $ Cuota de mercado  1999                                     : num  4 3 52 25 8 410 8 4 1 7 ...
##  $ Cuota de mercado  1998                                     : num  4 3 51 25 8 405 8 4 1 7 ...
##  $ Cuota de mercado  1997                                     : num  4 3 50 25 8 406 7 4 1 7 ...
##  $ Teléfonos  fijos 2012                                      : num  361 282 6643 3685 943 ...
##  $ Teléfonos  fijos 2011                                      : num  379 289 7007 3825 1003 ...
##  $ Teléfonos  fijos 2010                                      : num  387 311 6920 3824 1088 ...
##  $ Teléfonos  fijos 2009                                      : num  421 327 6701 3761 1131 ...
##  $ Teléfonos  fijos 2008                                      : num  452 347 6781 3829 1151 ...
##  $ Teléfonos  fijos 2007                                      : num  428 341 6165 3380 1081 ...
##  $ Teléfonos  fijos 2006                                      : num  440 357 5836 3144 1027 ...
##  $ Teléfonos  fijos 2005                                      : num  469 376 6566 3338 1033 ...
##  $ Teléfonos  fijos 2004                                      : num  468 388 6452 3182 1013 ...
##  $ Teléfonos  fijos 2003                                      : num  478 389 6359 3051 1013 ...
##  $ Teléfonos  fijos 2002                                      : num  485 398 6218 2965 991 ...
##  $ Teléfonos  fijos 2001                                      : num  480 389 6300 2994 985 ...
##  $ Teléfonos  fijos 2000                                      : num  476 381 5695 2685 918 ...
##  $ Teléfonos  fijos 1999                                      : num  477 372 5536 2607 883 ...
##  $ Teléfonos  fijos 1998                                      : num  471 348 5209 2517 850 ...
##  $ Teléfonos  fijos 1997                                      : num  448 310 4997 2429 826 ...
##  $ Teléfonos  fijos 1996                                      : num  438 304 4692 2305 786 ...
##  $ Variación teléfonos fijos 07-12 (%)                        : num  -15.7 -17.4 7.8 9 -12.7 12.3 -12.6 -26.7 -31.8 -10.7 ...
##  $ Líneas de banda ancha  2012                                : num  141 105 4409 2283 589 ...
##  $ Vehículos de motor  2012                                   : num  1208 1297 17170 10186 3092 ...
##  $ Vehículos de motor  2011                                   : num  1197 1275 16998 10251 3063 ...
##  $ Vehículos de motor  2010                                   : num  1179 1227 16829 10328 3038 ...
##  $ Vehículos de motor  2009                                   : num  1175 1175 16697 10454 3005 ...
##  $ Vehículos de motor  2008                                   : num  1162 1126 16522 10371 2902 ...
##  $ Vehículos de motor  2007                                   : num  1104 1037 15660 9793 2706 ...
##  $ Vehículos de motor  2006                                   : num  883 892 13756 9349 2355 ...
##  $ Vehículos de motor  2005                                   : num  799 833 12891 8784 2234 ...
##  $ Vehículos de motor  2004                                   : num  735 775 12115 8099 2091 ...
##   [list output truncated]

Vemos que cada fila es un municipio y cada columna una variable definida por la combinación de variables y años u otras características.

Ejemplo 2: Fichero pc-Axis desde el INE

En las páginas de datos del INE podemos ver que hay un enlace a ficheros PC-AXIS. Estos ficheros los podemos leer en R con el paquete pxR. Por ejemplo, en la página del padrón 2015 podemos ver los enlaces a una serie de ficheros .px. Entre ellos 1.4 Población por sexo, municipios y país de nacimiento

Cargarlo en R es tan sencillo como sigue:

Aquí vemos la utilidad del operador %>%. read.px carga los datos con un formato interno del paquete pxR que mantiene toda la información de un fichero pc-Axis. A veces nos puede interesar, pero nosotros queremos poner los ficheros en formato tibble. La función as_tibble nos permite convertir a tibble los datos desde el formato px. Se trata de una función genérica, recordar que R es inteligente (la palabra técnica es orientado a objetos) y funciona también para cualquier otro formato de origen que R pueda imaginar como convertir.

El resultado es un tibble en formato largo con 925680 filas y 4 columnas. Incluye los datos por país de nacionalidad en cada municipio español.

padron2015
## # A tibble: 925,680 × 4
##          país.de.nacimiento municipios        sexo    value
##                      <fctr>     <fctr>      <fctr>    <dbl>
## 1           Total Población      Total Ambos sexos 46624382
## 2         Nacidos en España      Total Ambos sexos 40461450
## 3  Nacidos en el Extranjero      Total Ambos sexos  6162932
## 4              Total Europa      Total Ambos sexos  2282591
## 5       Total Unión Europea      Total Ambos sexos  1968974
## 6                  Alemania      Total Ambos sexos   186928
## 7                  Bulgaria      Total Ambos sexos   133374
## 8                   Francia      Total Ambos sexos   205186
## 9                    Italia      Total Ambos sexos   104182
## 10                  Polonia      Total Ambos sexos    58511
## # ... with 925,670 more rows

Manipulación de datos en el tidyverse

Vamos a utilizar estos dos ejemplos de datos para mostrar cómo estos paquetes nos facilitan la vida. Bajate la chuleta de manipulación de datos de RStudio bien en inglés o en español. Todas las funciones tienen en común que están diseñadas para trabajar con el operador después %>% al tomar como primer elemento un objeto de datos.

Las tres funciones principales de tidyr son las siguientes:

Función Utilidad Argumentos
gather Pasar de forma ancha a larga key,value,cols
spread Pasar de forma larga a ancha key,value
separate Separar una columna en varias col, into, sep

Las funciones principales de dplyr, que se suelen encadenar en general unas con otras, son:

Función Utilidad Argumentos
select Selecciona variables a:x, -var1, …
filter Selecciona observaciones V1>5, !is.na(V2),…
mutate Muta variables ratio=V1/V2
rename Renombra variables año = fecha, …
arrange Ordena observaciones desc(V2), V1, …

Otros dos tipos de operaciones de dplyr son básicos.

  • left_join: Una primera es la de juntar objetos distintos que comparten al menos una variable. Para ello se utilizan las funciones xxx_join de dplyr, sobre todo left_join.

  • group_by + summarise: group_by indica que queremos descomponer el objeto de datos en grupos más pequeños de acuerdo a una/s dimensiones. summarise nos indica cómo resumir los datos para cada uno de los grupos definidos por group_by. También es posible utilizar mutate despuès de haber agrupado. Esto sirve para definir una mutación que utiliza información específica de cada grupo de datos. Por último, si queremos eliminar la agrupación, debemos hacer ungroup.

Además de estas funciones básicas hay otras funciones de dplyr que son útiles

Función Utilidad Ejemplos
slice Selecciona filas por posición slice(df,10:20)
tally Cuenta observaciones en cada grupo … group_by(V) %>% tally
count Recuentos sin necesidad de group_by … tally(Pais)
bind_rows Junta observaciones de 2 objetos bind_rows(obj1,obj2)

Cambios iniciales: poniendo los datos en la forma adecuada

Para este propósito las funciones más útiles son las del paquete tidyr (más las auxiliares necesarias de dplyr). Veamos dos ejemplos:

Ejemplo 1: Cambios iniciales en la variables del padrón con separate

Podemos ver cómo está guardada la información del padrón con

str(padron2015)
## Classes 'tbl_df', 'tbl' and 'data.frame':    925680 obs. of  4 variables:
##  $ país.de.nacimiento: Factor w/ 38 levels "Total Población",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ municipios        : Factor w/ 8120 levels "Total","01001-Alegría-Dulantzi",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ sexo              : Factor w/ 3 levels "Ambos sexos",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ value             : num  46624382 40461450 6162932 2282591 1968974 ...

Comprobamos que las variables con caracteres han sido guardadas como factores. Esto no es malo para variables categóricas como estas, pero si tiene un inconveniente: en la variable código del municipio, que incluye tanto el código INE de cinco números como el nombre del municipio, tenemos primero que pasar la variable municipios a character. Por otra parte, tenemos que separar el código INE del nombre del municipio. Para ello utilizaremos la función separate

La función separate sirve para pasar variables de tipo character que incluyen informaciones diversas en la misma cadena, a dos o más variables. Toma los siguientes argumentos:

args(separate)
## function (data, col, into, sep = "[^[:alnum:]]+", remove = TRUE, 
##     convert = FALSE, extra = "warn", fill = "warn", ...) 
## NULL
  • data: El objeto de datos. En nuestro caso padron2015.
  • col: La columna que queremos separar en dos o más partes. En nuestro caso, municipios. Hay que escribir directamente el nombre de la variable, sin ponerla entre comillas. Existe otra función si queremos especificar la columna como carácter, entre comillas: la función separate_. En caso de que el nombre de la variable incluya caracteres no estándar como eñes, acentos o espacios, también funciona escribirla entre comillas graves: `variable rárà`
  • into: Los nombres de las nuevas columnas que se crean. En nuestro caso podemos llamar cod a la parte con el código y municipio al nombre del municipio. Para ello hay que especificarlo como c("cod","municipio").
  • sep: Especifica por donde separar la columna original. Si es un número, es la posición en que separar. En nuestro queremos separar en el primer guión -. Hay que darse cuenta que hay municipios donde hay más de un guión: aquellos que tienen un nombre distinto en lengua vernácula (ej: ). Sería también posible separar en tres variables especficando 3 valores en into. Por otro lado, los nombre de los totales, como “Total”, no incluyen código.
  • remove: Por defecto es cierto. Controla si la variable col es reemplazada por las nuevas, o si se mantienen todas. Nos va bien la opción por defecto.
  • convert: Si deben tratar de convertirse las variables nuevas a su tipo en caso de que sean numéricas o lógicas. En nuestro caso nos va bien el valor por defecto FALSE.
  • extra: Qué hacer cuando al separar con sep encontramos más piezas que la longitud de into. Es nuestro caso. Hay dos opciones que podríamos utilizar: drop prescindiría de la tercera y sucesivas (dejándonos con el primer nombre del municipio), merge nos deja junto lo que venga después de la primera separación. Esta será nuestra opción. La opción por defecto es warn: utilizar drop pero dar un mensaje de precaución.
  • fill: Qué hacer cuando hay menos piezas de las que indica into, pegarlas a la derecha, rellenando en la izquierda (left), o pegarlas a la derecha rellenando en la derecha (right). Esto permite elegir que hacer con los casos como "Total". Vamos a rellenar en la izquierda. De este modo, para "Total" cod será NA, y municipio será "Total". Esta opción nos facilitará seleccionar las observaciones que no corresponden a municipios con la función is.na(cod)

En definitiva, el código para generar las variables separadas es:

padron2015 <- padron2015 %>% mutate(municipios=as.character(municipios)) %>% 
          separate(municipios,c("cod","municipio"),sep="-",
                   extra="merge",fill="left")

donde hemos reemplazado el objeto anterior por éste.

Por otro lado queremos generar una variable provincial y cambiar el nombre de la variable value a pob con rename. ¿Cómo generar una variable provincial a partir de los códigos INE? Los códigos INE incluyen dos primeros números que representan la provincia. Para poder generar el código provincial hacemos una mutación con mutate. Ambas funciones corresponden al paquete dplyr.

padron2015 <- padron2015 %>% mutate(prov=as.numeric(cod)%/%1000,prov=as.factor(prov)) %>% 
rename(pob=value)

Primero hemos definido el código de provincia mediante la división entera de cod por 1000 (al ser todos códigos del 1000 al 52000) y, por último, lo hemos convertido en factor. El rename vemos que es sencillo y aparte del mutate.

Ejemplo 2: Pasando datos de formato ancho a largo en el Anuario de La Caixa

El Anuario de la Caixa incluye un número muy elevado de columnas que no son verdaderas variables: no está en forma ordenada.

Vamos a seleccionar las columnas de población correspondientes a los años desde 1998 a 2012, y después a pasarlo a forma larga, en la que cada fila corresponda a la combinación de municipio y año. Por último, con separate generamos la variable numérica año.

La función básica para pasar de forma ancha a larga es gather, que nos pide como argumentos principales:

  • data: El objeto de datos, en nuestro caso AE13mun
  • key: El nombre que asignamos a la columna que incluya las etiquetas de las columnas en formato ancho. La podemos llamar columna
  • value: El nombre que asignamos a la columna que incluye los valores de dichas columnas, los numeros. La podemos llamar Población
  • …: Esto se refiere a la especificación de las columnas que queremos que pasen a estar en formato largo, con una fila distinta para cada valor de la columna. En nuestro caso son todas las columnas que empiezan por Población. Para ello podemos utilizar la función auxiliar del tidyverse, starts_with.
pobl = AE13mun %>% select(1:2, starts_with("Población")) %>% 
       gather(columna,pobl,starts_with("Población")) %>% 
       separate(columna,c("etiqueta","año"),convert=TRUE) %>% 
       select(-etiqueta) %>% arrange(`Código INE`,`año`)

Ya tenemos creado el objeto en forma larga. Si nos fijamos no contiene únicamente las poblaciones por año, sino que también “se han colado” el número de extranjeros y de españoles, de mujeres y de varones. Podemos seleccionar sólo los años forzando la conversión a número de la variable año con parse_number, y quitando las filas que queden con NA por no ser numéricas.

pobl = pobl %>% mutate(`año`=parse_number(`año`)) %>% filter(!is.na(`año`))

Este tipo de objetos son muy útiles, por ejemplo, para hacer gráficos con ggplot. Este sería el gráfico de la evolución de la población en cada uno de los municipios de la provincia de Salamanca, que estarán comprendidos entre 37000 y 37999:

pobl %>% filter(`Código INE`>"37000", `Código INE`<"37999") %>% 
   ggplot(aes(x=año,y=log(pobl),group=`Código INE`,color=`Código INE`)) + geom_line()

Sin entrar en detalles, en el gráfico logarítmico se observa el estancamiento de la capital y el crecimiento fuerte de algunos de los municipios del área metropolitana.

Resumenes de los datos: Uso reiterado de las funciones del tidyverse

Habitualmente para responder a una pregunta que nos interese necesitaremos aplicar varias funciones del tidyverse de forma sucesiva. Aprender a utilizarlo es preguntarse qué operaciones sucesivas tenemos que hacer en cada caso. Después escribir los comandos.

Ejemplo 1: Municipios salmantinos mayores de 5000 habitantes ordenados por población (de mayor a menor)

Tenemos que hacer dos cosas: primero filtrar (filter), y después ordenar (arrange). Salamanca tiene código provincial 37, y nos queremos fijar en toda la población. Este es el código:

library(knitr)  # Para poder sacar una tabla bonita en html con kable
padron2015 %>% filter(`país.de.nacimiento`=="Total Población",prov==37,
                      pob>5000,sexo=="Ambos sexos") %>% 
               select(municipio,pob) %>% 
               arrange(desc(pob)) %>% 
               kable
municipio pob
Salamanca 146438
Santa Marta de Tormes 14970
Béjar 13724
Ciudad Rodrigo 13052
Villamayor 6962
Carbajosa de la Sagrada 6740
Peñaranda de Bracamonte 6557
Villares de la Reina 6188
Guijuelo 5673
Alba de Tormes 5309

La función select dispone de un montón de especificidades que se pueden consultar, por ejemplo, en Sánchez( 2016). arrange permite ordenar de acuerdo a las variables que se especifiquen. Por defecto, de menor a mayor. Si queremos cambiar el orden hay que utilizar la función auxiliar desc, como en este caso, o, desde la última versión de tidyverse, escribir con signo negativo, -pob, cuando la variable es numérica como es el caso.

Ejemplo 2: Obtener los municipios salmantinos con mayor porcentaje de población extranjera (de ambos sexos)

Tenemos que filtrar primero (filter), seleccionando, de todos los origenes, sólo “Total Población” y “Nacidos en el Extranjero”. Después pasar a forma ancha (spread), mutar calculando la proporción extranjera (mutate), ordenar de mayor a menor (arrange), y seleccionar (select) columnas. Todas las operaciones las encadenamos con el operador %>%.

padron2015 %>% filter(prov==37,sexo=="Ambos sexos",
    `país.de.nacimiento`%in%c("Total Población","Nacidos en el Extranjero")) %>% 
    spread(`país.de.nacimiento`,pob) %>% 
    mutate(PropExtr=`Nacidos en el Extranjero`/`Total Población`*100) %>% 
    arrange(-PropExtr) %>% 
    select(-cod,-sexo,-prov) %>%  head(10) %>% kable(digits=2)
municipio Total Población Nacidos en el Extranjero PropExtr
Fuentes de Oñoro 1070 336 31.40
Armenteros 281 73 25.98
Valverde de Valdelacasa 85 22 25.88
Aldea del Obispo 313 79 25.24
Bouza, La 65 16 24.62
Puebla de Azaba 210 35 16.67
Campillo de Azaba 173 25 14.45
Tabera de Abajo 115 15 13.04
Fuentes de Béjar 254 32 12.60
Arcediano 109 13 11.93

Si queremos limitarnos a los municipios mayores de 1000 habitantes y con al menos 100 extranjeros se puede añadir un filter adicional en el sitio adecuado:

padron2015 %>% filter(prov==37,sexo=="Ambos sexos",
    `país.de.nacimiento`%in%c("Total Población","Nacidos en el Extranjero")) %>% 
    spread(`país.de.nacimiento`,pob) %>% 
    mutate(PropExtr=`Nacidos en el Extranjero`/`Total Población`*100) %>% 
    filter(`Total Población`>1000,`Nacidos en el Extranjero`>100) %>% 
    arrange(desc(PropExtr)) %>% 
    select(-cod,-sexo,-prov) %>% kable(digits=2)
municipio Total Población Nacidos en el Extranjero PropExtr
Fuentes de Oñoro 1070 336 31.40
Terradillos 3152 352 11.17
Guijuelo 5673 490 8.64
Ledesma 1778 146 8.21
Castellanos de Moriscos 2322 179 7.71
Salamanca 146438 11171 7.63
Santa Marta de Tormes 14970 1046 6.99
Villares de la Reina 6188 400 6.46
Carbajosa de la Sagrada 6740 424 6.29
Cabrerizos 4198 259 6.17
Ciudad Rodrigo 13052 787 6.03
Doñinos de Salamanca 1952 109 5.58
Béjar 13724 722 5.26
Villamayor 6962 364 5.23
Peñaranda de Bracamonte 6557 288 4.39
Alba de Tormes 5309 211 3.97
Vitigudino 2700 102 3.78

Para asegurarte de que comprendes bien estos ejemplos, una recomendación: puedes ir aplicando de manera sucesiva las distintas operaciones %>%: Seleccionas primero y ejecutas hasta el primer filter, luego incluyes el spread, …

Ejemplo 3: Provincias españolas ordenadas por la proporción de municipios menores de 1000 habitantes respecto al total de municipios

padron2015 %>% filter(!is.na(prov),sexo=="Ambos sexos",
                      `país.de.nacimiento`=="Total Población") %>% 
               mutate(menor1000=(pob<1000)) %>% 
               group_by(prov) %>% 
               summarise(n=n(),menor1000=sum(menor1000)) %>%
               mutate(prop=menor1000/n*100) %>% 
               arrange(desc(prop)) %>% head(10) %>% kable(digits=2)
prov n menor1000 prop
42 183 172 93.99
49 248 229 92.34
9 371 342 92.18
44 236 217 91.95
5 248 228 91.94
37 362 332 91.71
19 288 257 89.24
34 191 170 89.01
40 209 184 88.04
22 202 175 86.63

La función n() es otra de las funciones auxiliares del tidyverse. Una dificultad para leer los resultados es que las provincias aparecen por su código y no por su nombre. Vemos Salamanca en 6 posición.

Ejemplo 4: Provincias españolas ordenadas por la proporción de población viviendo en municipios menores de 1000 habitantes

Es una variación del anterior. A priori, parece muy distinto, pero no lo es. La idea es sencilla: añadir columnas en el summarise del ejemplo 6:

padron2015 %>% filter(!is.na(prov),sexo=="Ambos sexos",
                      `país.de.nacimiento`=="Total Población") %>% 
               mutate(menor1000=(pob<1000),pobmenor=pob*menor1000) %>% 
               group_by(prov) %>% 
               summarise(n=n(),menor1000=sum(menor1000),
                         pob=sum(pob),pobmenor=sum(pobmenor)) %>%
               mutate(prop_Munic=menor1000/n*100,prop_Pob=pobmenor/pob*100) %>% 
               arrange(desc(prop_Pob)) %>% head(10) %>% kable(digits=0)
prov n menor1000 pob pobmenor prop_Munic prop_Pob
49 248 229 183436 69181 92 38
44 236 217 138932 44183 92 32
5 248 228 164925 47043 92 29
16 238 206 203841 51835 87 25
40 209 184 157570 39895 88 25
42 183 172 91006 21937 94 24
37 362 332 339395 80042 92 24
22 202 175 222909 51955 87 23
34 191 170 166035 32361 89 19
10 222 152 406267 69991 68 17

Ejercicios 1

Preguntas como las siguientes tienen respuestas relativamente simples con estos datos:

  1. ¿Cuál es el código INE de Miranda de Ebro?
  2. ¿Cuántos extranjeros viven en Toledo?
  3. ¿Qué proporción de extranjeros hay en Mijas, Málaga?
  4. ¿Cuántos municipios españoles tienen más de un 40% de extranjeros?
  5. Tabla con las provincias clasificadas por mediana entre los municipios de número de extranjeros.
  6. Municipios salmantinos ordenados por número de brasileños (de ambos sexos).
  7. ¿Cuál es el municipio español con mayor proporción de mujeres? ¿qué proporción?
  8. ¿En qué provincia española hay mayor proporción de portugueses? ¿Cuál es esa proporción?
  9. ¿Para que nacionalidad de origen hay mayor desproporción entre los sexos?
  10. Os podéis hacer vuestra propias preguntas.

Leer datos de página web y juntar bases de datos.

En esta página tenemos los códigos provinciales INE. También los tenemos en ésta en formato excel. Cargarlos en R será fácil con read_excel

download.file("http://alarcos.esi.uclm.es/per/fruiz/pobesp/dat/list-pro.xls",destfile = "list-pro.xls",mode="wb")
provs=read_excel("list-pro.xls")

Aquí tenemos en CP el código provincial en formato chr, y en PROVINCIA la provincia. Podemos añadir prov que sea factor como en padron2015:

provs <- provs %>% mutate(prov=as.numeric(CP),prov=as.factor(prov))

¿Cómo añadir el código de provincia a un objeto que contenga la variable prov, tal como padron2015? Muy sencillo: con un left_join. Podríamos utilizarlo para añadir las otras variables, como número de municipios o superficie. Sólo nos interesa añadir PROVINCIA, asi que seleccionamos sólo las dos variables antes del join.

padron2015 <- padron2015 %>% 
              left_join(provs %>% select(PROVINCIA,prov),by="prov") 

Si repetimos el análisis de las provincias con más población en municipios menores de 1000 habitantes obtenemos:

padron2015 %>% filter(!is.na(prov),sexo=="Ambos sexos",
                      `país.de.nacimiento`=="Total Población") %>% 
               mutate(menor1000=(pob<1000),pobmenor=pob*menor1000) %>% 
               group_by(PROVINCIA) %>% 
               summarise(n=n(),menor1000=sum(menor1000),
                         pob=sum(pob),pobmenor=sum(pobmenor)) %>%
               mutate(prop_Munic=menor1000/n*100,prop_Pob=pobmenor/pob*100) %>% 
               arrange(-prop_Pob) %>% head(10) %>% kable(digits=1)
PROVINCIA n menor1000 pob pobmenor prop_Munic prop_Pob
Zamora 248 229 183436 69181 92.3 37.7
Teruel 236 217 138932 44183 91.9 31.8
Ávila 248 228 164925 47043 91.9 28.5
Cuenca 238 206 203841 51835 86.6 25.4
Segovia 209 184 157570 39895 88.0 25.3
Soria 183 172 91006 21937 94.0 24.1
Salamanca 362 332 339395 80042 91.7 23.6
Huesca 202 175 222909 51955 86.6 23.3
Palencia 191 170 166035 32361 89.0 19.5
Cáceres 222 152 406267 69991 68.5 17.2

Ejercicios 2

  1. El fichero de excel de las provincias también incluye códigos de Comunidades Autónomas, haz el left_join correspondiente para incluir una columna de CCAA en padron2015 y clasifica las CCAA por el porcentaje de municipios menores de 1000 habitantes.
  2. El fichero del AE2013 de la Caixa y los datos del padrón comparten el código INE que permite identificar a los municipios. Haz un left_join que añada a las datos del AE2013 los datos de población total del padrón 2015, y calcula tasas de crecimiento demográfico por municipios desde 2013 a 2015.