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 el tidyverse:
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
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/20141028002111if_/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=c("n.d.","n.s."))
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. La función read_excel permite proporcionar más de un código de NA (no disponible). 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 = NULL, range = NULL, col_names = TRUE,
## col_types = NULL, na = "", trim_ws = TRUE, skip = 0, n_max = Inf,
## guess_max = min(1000, n_max), progress = readxl_progress(),
## .name_repair = "unique")
## 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)
## tibble [3,316 x 315] (S3: tbl_df/tbl/data.frame)
## $ Nombre Municipio o Total Provincial y/o CC.AA. : chr [1:3316] "Abla" "Abrucena" "Adra" "Albox" ...
## $ Código INE : chr [1:3316] "04001" "04002" "04003" "04006" ...
## $ Población 2012 : num [1:3316] 1465 1360 24626 10821 3847 ...
## $ Población 2011 : num [1:3316] 1480 1391 24512 11091 3835 ...
## $ Población 2010 : num [1:3316] 1463 1367 24512 11042 3824 ...
## $ Población 2009 : num [1:3316] 1504 1341 24373 11178 3779 ...
## $ Población 2008 : num [1:3316] 1503 1366 23880 11427 3724 ...
## $ Población 2007 : num [1:3316] 1514 1379 23742 11166 3587 ...
## $ Población 2006 : num [1:3316] 1505 1339 23545 11000 3522 ...
## $ Población 2005 : num [1:3316] 1512 1358 23195 11271 3438 ...
## $ Población 2004 : num [1:3316] 1482 1386 22257 10680 3319 ...
## $ Población 2003 : num [1:3316] 1480 1391 21704 10409 3253 ...
## $ Población 2002 : num [1:3316] 1529 1413 22034 9974 3241 ...
## $ Población 2001 : num [1:3316] 1517 1437 21810 9661 3201 ...
## $ Población 2000 : num [1:3316] 1516 1455 21505 9599 3165 ...
## $ Población 1999 : num [1:3316] 1519 1460 21286 9671 3124 ...
## $ Población 1998 : num [1:3316] 1516 1462 21016 9471 3111 ...
## $ Población varones : num [1:3316] 765 699 12493 5489 1961 ...
## $ Población mujeres : num [1:3316] 700 661 12133 5332 1886 ...
## $ Población españoles : num [1:3316] 1288 1251 21563 8080 3421 ...
## $ Población extranjeros : num [1:3316] 177 109 3063 2741 426 ...
## $ Variación población 07-12 (Absoluta) : num [1:3316] -49 -19 884 -345 260 ...
## $ Variación población españoles 07-12 (absoluta) : num [1:3316] -121 -73 -41 -500 113 ...
## $ Variación población extranjera 07-12 (absoluta) : num [1:3316] 72 54 925 155 147 ...
## $ Variación población 07-12 (%) : num [1:3316] -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:3316] -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 [1:3316] -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 [1:3316] -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 [1:3316] -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 [1:3316] -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:3316] -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:3316] -1 -0.1 0.9 -0.2 0.5 0.7 1.7 1.3 2.7 2.2 ...
## $ Extensión (km2) : num [1:3316] 45 84 90 168 26 296 99 66 47 17 ...
## $ Paro registrado en % s/población potencialmente activa 2012: num [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 6.9 3.3 4.2 6.9 7.2 8.1 4.4 5.5 5.8 5.7 ...
## $ % Paro de varones : num [1:3316] 13.6 10.8 17.6 13.3 18.6 19.2 8.9 8.4 11.4 18 ...
## $ % Paro de mujeres : num [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 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 [1:3316] 3 3 53 26 8 407 8 8 2 8 ...
## $ Cuota de mercado 2011 : num [1:3316] 3 3 53 26 8 406 9 8 2 8 ...
## $ Cuota de mercado 2010 : num [1:3316] 3 3 53 27 8 407 9 8 2 8 ...
## $ Cuota de mercado 2009 : num [1:3316] 3 3 53 27 8 407 9 8 2 8 ...
## $ Cuota de mercado 2008 : num [1:3316] 3 3 53 28 8 408 9 8 2 8 ...
## $ Cuota de mercado 2007 : num [1:3316] 3 3 54 28 8 410 9 7 2 8 ...
## $ Cuota de mercado 2006 : num [1:3316] 3 3 53 27 8 411 8 7 2 8 ...
## $ Cuota de mercado 2005 : num [1:3316] 3 3 53 28 8 406 9 6 2 7 ...
## $ Cuota de mercado 2004 : num [1:3316] 3 3 53 27 8 406 8 5 2 7 ...
## $ Cuota de mercado 2003 : num [1:3316] 4 3 52 26 8 407 8 4 2 7 ...
## $ Cuota de mercado 2002 : num [1:3316] 4 3 52 25 8 408 8 4 1 7 ...
## $ Cuota de mercado 2001 : num [1:3316] 4 3 52 25 8 408 8 4 1 7 ...
## $ Cuota de mercado 2000 : num [1:3316] 4 3 52 25 8 409 8 4 1 7 ...
## $ Cuota de mercado 1999 : num [1:3316] 4 3 52 25 8 410 8 4 1 7 ...
## $ Cuota de mercado 1998 : num [1:3316] 4 3 51 25 8 405 8 4 1 7 ...
## $ Cuota de mercado 1997 : num [1:3316] 4 3 50 25 8 406 7 4 1 7 ...
## $ Teléfonos fijos 2012 : num [1:3316] 361 282 6643 3685 943 ...
## $ Teléfonos fijos 2011 : num [1:3316] 379 289 7007 3825 1003 ...
## $ Teléfonos fijos 2010 : num [1:3316] 387 311 6920 3824 1088 ...
## $ Teléfonos fijos 2009 : num [1:3316] 421 327 6701 3761 1131 ...
## $ Teléfonos fijos 2008 : num [1:3316] 452 347 6781 3829 1151 ...
## $ Teléfonos fijos 2007 : num [1:3316] 428 341 6165 3380 1081 ...
## $ Teléfonos fijos 2006 : num [1:3316] 440 357 5836 3144 1027 ...
## $ Teléfonos fijos 2005 : num [1:3316] 469 376 6566 3338 1033 ...
## $ Teléfonos fijos 2004 : num [1:3316] 468 388 6452 3182 1013 ...
## $ Teléfonos fijos 2003 : num [1:3316] 478 389 6359 3051 1013 ...
## $ Teléfonos fijos 2002 : num [1:3316] 485 398 6218 2965 991 ...
## $ Teléfonos fijos 2001 : num [1:3316] 480 389 6300 2994 985 ...
## $ Teléfonos fijos 2000 : num [1:3316] 476 381 5695 2685 918 ...
## $ Teléfonos fijos 1999 : num [1:3316] 477 372 5536 2607 883 ...
## $ Teléfonos fijos 1998 : num [1:3316] 471 348 5209 2517 850 ...
## $ Teléfonos fijos 1997 : num [1:3316] 448 310 4997 2429 826 ...
## $ Teléfonos fijos 1996 : num [1:3316] 438 304 4692 2305 786 ...
## $ Variación teléfonos fijos 07-12 (%) : num [1:3316] -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 [1:3316] 141 105 4409 2283 589 ...
## $ Vehículos de motor 2012 : num [1:3316] 1208 1297 17170 10186 3092 ...
## $ Vehículos de motor 2011 : num [1:3316] 1197 1275 16998 10251 3063 ...
## $ Vehículos de motor 2010 : num [1:3316] 1179 1227 16829 10328 3038 ...
## $ Vehículos de motor 2009 : num [1:3316] 1175 1175 16697 10454 3005 ...
## $ Vehículos de motor 2008 : num [1:3316] 1162 1126 16522 10371 2902 ...
## $ Vehículos de motor 2007 : num [1:3316] 1104 1037 15660 9793 2706 ...
## $ Vehículos de motor 2006 : num [1:3316] 883 892 13756 9349 2355 ...
## $ Vehículos de motor 2005 : num [1:3316] 799 833 12891 8784 2234 ...
## $ Vehículos de motor 2004 : num [1:3316] 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.
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:
# install.packages("pxR") # Si no está ya instalado y nos da error la línea siguiente
library(pxR)
library(tidyverse) # Para tener ya disponible el operador %>%
padron2015 <- read.px("http://www.ine.es/pcaxisdl/t20/e245/p05/a2015/l0/00000004.px") %>% as_tibble
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 data.frame, o aún mejor, tiabla. La función as_tibble nos permite pasar los datos directamente a tiabla desde px.
El resultado es una tiabla en formato largo con 925680 filas y 4 columnas. Incluye los datos por país de nacionalidad en cada municipio español.
tidyverseVamos a utilizar estos dos ejemplos de datos para mostrar cómo estos paquetes nos facilitan la vida. Bajaos la chuleta de manipulación de datos de RStudio bien en inglés o en español. Las dos bibliotecas 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 |
|---|---|---|
pivot_longer |
Pasar a forma más larga | cols,names_to,values_to |
pivot_wider |
Pasar a forma más ancha | names_from,values_from |
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 |
|---|---|---|
pull |
Extrae variable como vector | df %>% pull(var1) |
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) |
across |
Transforma varias variables a la vez | across(starts_with(“Pob”),log) |
Para este propósito las funciones más útiles son las del paquete tidyr (más las auxiliares necesarias de dplyr). Veamos dos ejemplos:
separatePodemos ver cómo está guardada la información del padrón con
str(padron2015)
## '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: 01001-Alegría-Dulantzi). 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 lo hemos definido dividiendo pasándolo a número, haciendo la división entera 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.
ancho a largo en el Anuario de La CaixaEl 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 pivot_longer, que nos pide como argumentos principales:
data: El objeto de datos, en nuestro caso AE13muncols: Las columnas que pivotamos a formato largo. En nuestro caso son todas las columnas que empiezan por Población. Para ello podemos utilizar la función auxiliar del tidyverse, starts_with.names_to: El nombre que asignamos a la columna que incluya las etiquetas de las columnas en formato ancho. La podemos llamar "año"names_prefix: Prefijo que quitar del nombre de las variables. En nuestro caso, si especificamos names_prefix="Población ", nos ahorramos la necesidad de un separate.values_to: El nombre que asignamos a la columna que incluye los valores de dichas columnas, los numeros. La podemos llamar "pobl" de población.pobl = AE13mun %>% select(1:2, starts_with("Población ")) %>%
pivot_longer(starts_with("Población "),
names_to="año",names_prefix="Población ",
values_to="pobl") %>%
mutate(año=parse_number(año)) %>%
arrange(`Código INE`,`año`)
Ya tenemos creado el objeto en forma larga. Un detalle: hemos tenido que utilizar starts_with("Población ") y no starts_with("Población") porque hay otras variables con un espacio como “Población varones”. También utilizamos parse_number para convertir a número. Es más fuerte que as.numeric: fuerza la conversión a número con lo que parezca un número en la cadena.
Este tipo de objetos en formato largo 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 están comprendidos entre 37000 y 37999:
pobl %>% filter(`Código INE`>"37000", `Código INE`<"37999") %>%
ggplot(aes(x=año,y=pobl,group=`Código INE`,color=`Código INE`)) + geom_line() + scale_y_continuous(trans="log")
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.
tidyverseHabitualmente 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.
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(2019). 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, cuando la variable es numérica como es el caso, escribir con signo negativo, -pob.
kable no hace falta para mostrar los resultados en una sesión interactiva. Se trata de una función del paquete knitr para dar formato sencillo al html o el fichero que genere el Rmd. Sólo tiene sentido en ficheros Rmarkdown.
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 (pivot_wider), 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")) %>%
pivot_wider(names_from=`país.de.nacimiento`,
values_from=pob) %>%
mutate(PropExtr=`Nacidos en el Extranjero`/`Total Población`*100) %>%
arrange(desc(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 en el sitio adecuado:
padron2015 %>% filter(prov==37,sexo=="Ambos sexos",
`país.de.nacimiento`%in%c("Total Población","Nacidos en el Extranjero")) %>%
pivot_wider(names_from=`país.de.nacimiento`,
values_from=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, …
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)
## `summarise()` ungrouping output (override with `.groups` argument)
| 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. El argumento digits en kable permite controlar cuántos decimales se imprimen en la tabla.
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)
## `summarise()` ungrouping output (override with `.groups` argument)
| 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 |
Preguntas como las siguientes tienen respuestas relativamente simples con estos 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("https://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 tenga 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(desc(prop_Pob)) %>% head(10) %>% kable(digits=1)
## `summarise()` ungrouping output (override with `.groups` argument)
| 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 |
left_join correspondiente para incluir una columna de CCAA en padron2015 y clasifica las CCAA por el porcentaje de municipios menores de 1000 habitantes.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.