R + SDMX + Eurostat
Diego Torres
Thursday, June 18, 2015
Más referencias y ejemplos pueden encontrar en:
- http://ec.europa.eu/eurostat/web/sdmx-web-services/example-queries
- http://stats.oecd.org/Sdmxws/sdmx.asmx
- https://www.ecb.europa.eu/stats/services/sdmx/html/index.en.html
- http://comtrade.un.org/data/Doc/api/ex/r
En resumen, el código hace lo siguiente: 1. Unas líneas de código para verificar si las librerías necesarias están instaladas, caso contrario, las descaga e instala.
- Descarga los datos desde Eurostat utilizando el formato SDMX al introducir los indicadores, países y periodos deseados.
- Filtra la base descargada, seleccionando sólo unos indicadores (esto es a modo de ejemplo, porque podría haber descargado sólo los indicadores que realmente necesito).
- Recodifico una variable tipo texto en una variable nueva, agrupando categorías distintas en una sola. En la base tenía grupos de edad desagregadas pero yo necesitaba las edades de 15 a 64 años, así que las agrupé.
- Luego de recodificar la variable grupo de edad ya puedo crear una nueva base que tenga los grupos de edad que yo necesito. Sumando para el grupo de edad creado la variable de interés.
- El penúltimo paso es convertir esta base tipo long en wide. Es decir, que los años que estaban dentro de una columna, pasarlos a que cada año sea una columna distinta en donde la intersección tiene el valor de la variable a analizar.
- Por último, creo un excel con los datos en el formato necesario.
#====================================
# Author: Diego Jose Torres Torres
# Purpose: Using the rsdmx package to
# read Eurostat sdmx service (Could also work for OECD)
# References:
# https://github.com/opensdmx/rsdmx
# http://ec.europa.eu/eurostat/web/sdmx-web-services/example-queries
# Examples:
# http://stats.oecd.org/restsdmx/sdmx.ashx/GetData/MIG/TOT../OECD?startTime=2000&endTime=2011
# http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/nama_gdp_c/..../?startperiod=2013&endPeriod=2013
#====================================
rm(list = ls(all = TRUE)) #borra todo los objetos de la memoria
if (!require("rsdmx")) {install.packages("rsdmx")}
if (!require("dplyr")) {install.packages("dplyr")}
if (!require("reshape2")) {install.packages("reshape2")}
if (!require("xlsx")) {install.packages("xlsx")}
# Parameters
setwd("d:/Mis Documentos/Europa/R/data") # Definir el directorio de trabajo
data_code <- "demo_pjanind"
geo <- "FR" # País
startperiod <- "1960"
endperiod <- "2014"
indic_na <- paste("PC_Y0_4",
"PC_Y0_14",
"PC_Y0_19",
"PC_Y5_9",
"PC_Y10_14",
"PC_Y15_19",
"PC_Y15_24",
"PC_Y20_24",
"PC_Y20_39",
"PC_Y25_44",
"PC_Y25_29",
"PC_Y25_49",
"PC_Y30_34",
"PC_Y35_39",
"PC_Y40_44",
"PC_Y40_59",
"PC_Y45_49",
"PC_Y45_64",
"PC_Y50_54",
"PC_Y50_64",
"PC_Y55_59",
"PC_Y60_64",
"PC_Y60_79",
"PC_Y60_MAX",
"PC_Y65_69",
"PC_Y65_79",
"PC_Y65_MAX",
"PC_Y70_74",
"PC_Y75_79",
"PC_Y80_84",
"PC_Y80_MAX",
"PC_Y85_MAX",
sep="+")
# Importing data
dataURL <- paste("http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/",
data_code,
"/.",
indic_na,
".",
geo,
"/?startperiod=",
startperiod ,
"&endPeriod=",
endperiod,
sep=""
)
sdmx <- readSDMX(dataURL)
stats <- as.data.frame(sdmx)
head(stats)
poblacion_filtrada <- filter(stats, INDIC_DE == "PC_Y0_14" |
INDIC_DE == "PC_Y15_24" |
INDIC_DE == "PC_Y25_44" |
INDIC_DE == "PC_Y45_64" |
INDIC_DE == "PC_Y65_MAX")
rm(stats) # borro la base completa
#======================================
# Recodificar una variable tipo texto
#======================================
# Paso 1 creo una variable nueva sobra la cual voy a recodificar
poblacion_filtrada$gruposedad <- poblacion_filtrada$INDIC_DE
poblacion_filtrada$gruposedad[poblacion_filtrada$gruposedad=="PC_Y15_24"|
poblacion_filtrada$gruposedad=="PC_Y25_44"|
poblacion_filtrada$gruposedad=="PC_Y45_64"] <- "PC_Y15_64"
poblacion_filtrada <- group_by(poblacion_filtrada,gruposedad , obsTime, GEO) #agrupado para calculos
# Sumando segun la nueva recodificación
poblacion_agrupada <- as.data.frame(summarize(poblacion_filtrada, porc=sum(obsValue)))
#======================================
# DE Long to Wide (años en columnas)
#======================================
names(poblacion_agrupada)
poblacion_agrupada_wide <- dcast(poblacion_agrupada, GEO + gruposedad ~ obsTime, value.var ="porc" )
#======================================
# Exportar a un excel
#======================================
write.xlsx(poblacion_agrupada_wide,
paste(geo,"Europop_historico.xlsx", sep=""),
sheetName="Datos",col.names=TRUE, row.names=TRUE, append=FALSE, showNA=TRUE)
Espero que les sea útil. Cualquier cosa, contactar conmigo:https://twitter.com/diego_torres Mi twitter
https://es.linkedin.com/in/diegotorrestorres Mi perfil en el LinkedIn
http://tweetrelevante.blogspot.com.es/ Identificando los tuits más relevantes de Twitter
http://vacanlab.blogspot.com.es/ Un buscador de empleo
https://www.linkedin.com/grp/home?gid=5185072 Grupo Nowcasting en Economía