jueves, 23 de junio de 2016

Importación selectiva de datos desde una hoja de cálculo

Una de las grandes ventajas del lenguaje R es su capacidad de importar datos desde múltiples fuentes. En muchos casos los datos de origen se encuentran en una hoja de cálculo, aunque la estructura de ésta puede diferir con frecuencia de la estructura ideal con la que nos gustaría tener nuestros datos en R para su análisis. Así los datos que nos interesan pueden estar acompañados de cabeceras y códigos suplementarios que añaden “ruido” y dificultan su tratamiento posterior. Puede ocurrir que no todas las filas o columnas de la hoja de cálculo nos interesan para nuestros fines de análisis y resultaría muy prolijo su eliminación antes o después del volcado de datos.
Pero R cuenta con herramientas que nos permiten de forma muy precisa elegir qué datos queremos importar desde una hoja de cálculo y cómo tratarlos en el mismo proceso de volcado, además de poder reutilizar en el futuro el mismo código aunque la hoja de cálculo de origen se vaya ampliando con el paso del tiempo.

Hoja de cálculo de origen

La Caixa Research elabora el Anuario Económico de España que incluye varias hojas de cálculo que reúnen un abanico de indicadores socio-demográficos y económicos referidos a todos los municipios españoles de más de 1.000 habitantes. Utilizaremos la hoja de cálculo del Anuario de 2013 titulada AE13_Municipal_Completo.xlsx, que está incluida en un fichero de formato zip.
Antes de iniciar la importación de datos habremos descargado el fichero zip en nuestro directorio de trabajo, para a continuación descomprimirlo.

Inspeccionando la hoja de cálculo

La hoja de cálculo contiene 3.317 filas y 315 columnas, correspondiendo la primera fila a los nombres de los indicadores y las dos primeras columnas a los nombres de los municipios y sus códigos INE respectivamente. Sólo queremos importar un número reducido de indicadores.
Lo que representa cada indicador se recoge en la misma página web en el documento titulado AE13_Indicadores_representativos_de_la_actividad_economica.pdf, que incluido dentro del fichero zip “Definiciones, Notas y Metodología”.
Por otra parte, nos interesan únicamente los municipios del Principado de Asturias.
Todo ello está incluido en la única hoja del fichero, que se titula “Anuario_1”.

Selección de datos a volcar

Las columnas que queremos volcar serían las siguientes:
Indicador
1 Nombre Municipio o Total Provincial y/o CC.AA.
2 Código INE
3 Población 2012
21 Población extranjeros
33 Extensión (km²)
34 Paro registrado en % s/población potencialmente activa 2012
56 Cuota de mercado 2012
163 Oficinas de entidades de depósito 2013
307 Índice industrial
308 Índice comercial
311 Índice de restauración y bares
312 Índice turístico
314 Índice actividad económica
Para seleccionarlas crearemos el siguiente vector:
columnas <-  c (1, 2, 3, 21, 33, 34, 56, 163, 307, 308, 311, 312, 314)
A su vez, los municipios del Principado de Asturias son aquéllos cuyo código INE consta de cinco cifras comenzando por “330 _ _“, que se recogen en las líneas 703 a 764 de la hoja de cálculo.

Importación a R

En primer lugar, activamos el paquete que necesitamos para importar datos desde ficheros tipo “xls” y “xlsx”. Como el fichero de origen es bastante grande, es aconsejable utilizar el paquete “openxlsx”:
library ("openxlsx")
Utilizamos la función “read.xlsx” incluyendo los siguientes parámetros:
  • Nombre del fichero de origen con su “path” completo
  • cols: columnas que importamos, las del vector “columnas” que hemos creado
  • rows: las filas que importamos, la primera (nombres de las variables) y las que van de la 703 a la 764 (municipios de Asturias)
  • sheet: el nombre de la hoja de la que extraemos los datos
El comando completo es el siguiente:
ae13_Asturias <-  read.xlsx ( 
 "C:/directorio_para_R/AE13_Municipal_Completo.xlsx",
 cols = columnas,
 rows = c (1, 703 : 764),
 sheet = "Anuario_1")
Se crea un data.frame con la siguiente estructura:
str (ae13_Asturias)
## 'data.frame':    62 obs. of  13 variables:
##  $ Nombre.Municipio.o.Total.Provincial.y/o.CC.AA.             : chr  "Allande" "Aller" "Avilés" "Belmonte de Miranda" ...
##  $ Código.INE                                                 : chr  "33001" "33002" "33004" "33005" ...
##  $ Población.2012                                             : num  1939 12136 83107 1740 1880 ...
##  $ Población.extranjeros                                      : num  63 221 3588 40 48 ...
##  $ Extensión.(km2)                                            : num  342 376 27 208 33 120 238 38 72 213 ...
##  $ Paro.registrado.en.%.s/población.potencialmente.activa.2012: num  8.2 14.4 13.4 6.8 11.1 10.2 9.8 14.3 10.7 12 ...
##  $ Cuota.de.mercado.2012                                      : num  5 28 175 4 4 5 6 2 4 17 ...
##  $ Oficinas.de.entidades.de.depósito.2013                     : num  4 14 62 3 2 4 5 1 1 7 ...
##  $ Índice.industrial                                          : num  45 15 198 24 1 25 6 1 1 4 ...
##  $ Índice.comercial                                           : num  2 14 175 2 1 3 3 1 2 13 ...
##  $ Índice.de.restauración.y.bares                             : num  4 20 145 3 1 3 4 1 1 20 ...
##  $ Índice.turístico                                           : num  2 3 40 1 1 1 14 4 1 43 ...
##  $ Índice.actividad.económica                                 : num  16 12 153 9 1 10 4 1 1 8 ...
Como los nombres de las variables resultan un poco largos, podemos asignar nombres más funcionales. Creamos un primer lugar un vector con los nuevos nombres para después asignarlos a las variables del data.frame:
variables <- c ("municipio", "codigoINE", "poblacion", "extranjeros", "superficie", "paro%", "cuotaMercado", "entidadesDeposito", "ind_Industrial", "ind_Comercial", "ind_restauracion", "ind_turistico", "ind_activ_economica")
names (ae13_Asturias) <- variables
La estructura es ahora:
str (ae13_Asturias)
## 'data.frame':    62 obs. of  13 variables:
##  $ municipio          : chr  "Allande" "Aller" "Avilés" "Belmonte de Miranda" ...
##  $ codigoINE          : chr  "33001" "33002" "33004" "33005" ...
##  $ poblacion          : num  1939 12136 83107 1740 1880 ...
##  $ extranjeros        : num  63 221 3588 40 48 ...
##  $ superficie         : num  342 376 27 208 33 120 238 38 72 213 ...
##  $ paro%              : num  8.2 14.4 13.4 6.8 11.1 10.2 9.8 14.3 10.7 12 ...
##  $ cuotaMercado       : num  5 28 175 4 4 5 6 2 4 17 ...
##  $ entidadesDeposito  : num  4 14 62 3 2 4 5 1 1 7 ...
##  $ ind_Industrial     : num  45 15 198 24 1 25 6 1 1 4 ...
##  $ ind_Comercial      : num  2 14 175 2 1 3 3 1 2 13 ...
##  $ ind_restauracion   : num  4 20 145 3 1 3 4 1 1 20 ...
##  $ ind_turistico      : num  2 3 40 1 1 1 14 4 1 43 ...
##  $ ind_activ_economica: num  16 12 153 9 1 10 4 1 1 8 ...
En fin, podemos guardar el fichero de datos en un formato específico de R que ocupa un reducido espacio (en este caso 3K), con la función save:
save (ae13_Asturias, file = "C:/directorio_para_R/ae13_Asturias.RData")
Para volverlo a cargar:
load ("C:/directorio_para_R/ae13_Asturias.RData")