Descargar,
importar (y exportar)
datos con R

Módulo práctico de ITA
(Grupo M)

Se pueden conseguir datos de muchos sitios

  • Lo normal es descargarlos de Bases de datos en la WEB


  • En Economía es muy habitual usar datos de agencias estadísticas oficiales como el INE, Eurostat, etc … pero se pueden conseguir datos de muchos otros sitios


  • Por ejemplo, aquí puedes encontrar un listado amplio de fuentes de datos.


¿Cómo podemos descargar unos datos?


¿Y cómo se descargan esos mismos datos con R?

  • Podríamos hacerlo por menús, pero lo vamos a hacer con código.

  • Al principio es un poco más complicado, pero tiene ventajas, y además a un Economista le conviene saber usar R

  • Veámoslo con un ejemplo

Tarea: descargar un fichero de datos con R


  • Intenta descargar el fichero con R.


  • En los siguientes “Tabs” tienes pistas y luego la solución
  1. Crear un objeto donde almacenar la url donde está el archivo de datos:
my_url <- "https://raw.githubusercontent.com/perezp44/archivos_download/refs/heads/master/plazas_turisticas.csv"


  1. Usar la función download.file() para descargar el fichero. Tendrás que darle el valor de 2 argumentos:

    • el url donde está el fichero de datos

    • la ruta de tu ordenador donde quieres guardar los datos.


(Recuerda que estamos trabajando con proyectos, así que puedes usar rutas relativas)

1my_url <- "https://raw.githubusercontent.com/perezp44/archivos_download/refs/heads/master/plazas_turisticas.csv"

2fs::dir_create("pruebas")

3download.file(my_url, "./pruebas/plazas_turisticas.csv")

4download.file(url = my_url,
              destfile = "./pruebas/plazas_turisticas.csv")
1
Almacenamos la url en el objeto my_url
2
Creamos, con código, una carpeta llamada pruebas donde guardaremos los datos
3
Usamos la función download.file() para descargar los datos que hay en my_url. Los guardamos en la carpeta pruebas de nuestro proyecto. Concretamente en el fichero plazas_turisticas.csv
4
Hace exactamente lo mismo que 3, pero esta vez, hemos especificado el nombre de los dos argumentos de la función.


my_url <- "https://raw.githubusercontent.com/perezp44/archivos_download/refs/heads/master/plazas_turisticas.csv"  

1my_ruta <- "./pruebas/plazas_turisticas.csv"


2curl::curl_download(url = my_url,
                    destfile = my_ruta)       
1
Es bueno hacer el código modular (por si queremos cambiar las rutas en el futuro). Por eso, especificamos en my_ruta el sitio donde guardaremos los datos
2
Usamos curl::curl_download() para descargar el fichero. Es una función más moderna que download.file().

Importación de datos



  • La primera etapa de un análisis de datos consiste en cargar los datos en R (en la memoria de R, en el Global)

podemos usar/cargar datos de los paquetes

  • Muchos paquetes de R contienen datos que podemos usar


para ello … intenta entender el siguiente chunk de código


#- cuando iniciamos R se cargan automáticamente un grupo de paquetes (R-base)
print(.packages()) #- [🌶]imprimimos los nombres de los "currently attached packages"

#- en uno de esos paquetes hay un conjunto de datos llamado "iris"
iris          #- llamamos a "iris"
find("iris")  #- [🌶] ¿donde está iris?
str(iris)     #- qué es iris?


my_iris <- iris  #- "hacemos una copia" de iris en el Global
find("my_iris")  #- ¿donde está my_iris?

iris <- c(2, 4)    #- creamos un vector llamado iris
find("iris")       #- ¿donde está ahora iris?


Tarea: usar unos datos de un paquete


  • Quiero usar el conjunto de datos penguins que está en el paquete palmerpenguins


  • Lógicamente, para poder usar esos datos, tenemos que tener instalado el paquete. Podemos hacerlo con install.packages("palmerpenguins")


  • Después hay que cargar el paquete con library(palmerpenguins)


  • Una vez hecho esto, ya podemos ver y usar el conjunto de datos penguins


1library(palmerpenguins)

2mys_pinguinos <- penguins
1
Cargamos el paquete en el Global, en la memoria de R. Lógicamente antes hay que instalar el paquete con install.packages("palmerpenguins")
2
Creamos un objeto llamado mys_pinguinos que es una copia de los datos penguins


1mys_pinguinos <- palmerpenguins::penguins
1
Es una forma alternativa de cargar los datos de penguins sin cargar todo el paquete

Importación de datos (de nuestro disco duro)



  • Vamos a cargar en R datos que tenemos en nuestro ordenador


  • Posiblemente, los hemos descargado previamente de la WEB

Los datos más habituales en Economía son los datos tabulares

  • Hay múltiples formatos tabulares: .csv, .xlsx, .sav , .dta, etc …

Cuando carguemos/importemos esos datos tabulares en R …

  • Se almacenarán internamente en R como data.frames

RStudio permite cargar datos usando menús.

  • Usando menús (File > Import Dataset) se pueden cargar datos CSV, EXCEL, SPSS, SAS y STATA.

  • Se puede hacer con menús, pero nosotros usaremos código


(La razón es que queremos que nuestros análisis sean reproducibles)

Para importar (y exportar) datos utilizaremos código

  • Usaremos funciones, concretamente funciones del paquete rio que permite importar y exportar ficheros en casi cualquier formato.


  • Para importar datos en R usaremos la función rio::import()
  • Para exportar datos en R usaremos la función rio::export()

importando datos con rio::import()

  • La función rio::import() tiene varios argumentos, pero solo usaremos el primero.


  • Su primer argumento se llama file y su descripción dice que el valor de file ha de ser: “A character string naming a file, URL, or …”


  • Es decir, el valor de file ha de ser la ruta de nuestro ordenador donde están los datos que queremos importar


Tarea: importar a R datos que tenemos guardados en nuestro ordenador


  • ¿Te acuerdas de que antes hemos descargado unos datos en el fichero ./pruebas/plazas_turisticas.csv?


  • La tarea consiste en cargar esos datos en R (en el Global, en memoria de R)


  • Has de usar la función rio::import()


  • En su primer argumento (llamado file) has de especificar la ruta donde están los datos


  • Recuerda que hemos guardado los datos en ./pruebas/plazas_turisticas.csv


1my_ruta <- "./pruebas/plazas_turisticas.csv"

2df <- rio::import(my_ruta)
1
Guardamos en my_ruta la ruta a los datos que quiero importar
2
Creamos un objeto llamado df con los datos que hay en my_ruta


my_ruta <- "./pruebas/plazas_turisticas.csv"   

1df <- rio::import(file = my_ruta)
1
Esta vez ponemos el nombre del argumento file y el valor del argumento my_ruta en la función rio::import()

Una vez tenemos los datos en R …

  • … podemos comenzar a trabajar en nuestros datos; por ejemplo para limpiarlos


… imagina que alguien nos pide esos datos limpios

¿Qué hacemos?


  • Tendremos que exportar/guardar los datos en un fichero de nuestro ordenador para poder enviárselos

Exportación de datos



  • Vamos a exportar/guardar en nuestro ordenador datos que tengamos en la memoria de R


Exportando datos en R con el paquete rio


  • Para exportar datos en R usaremos la función rio::export()

  • La función rio::export() tiene varios argumentos, pero solo usaremos los dos primeros.


  1. El primer argumento se llama x (su valor ha de ser un objeto/datos de R que queremos exportar)


  1. El segundo argumento se llama file (su valor ha de ser la ruta donde queremos guardar los datos)


Tarea: exportar unos datos de R a un fichero

  • Carga unos datos en R y expórtalos a un fichero en tu ordenador


  • Por ejemplo, puedes exportar los datos iris a un fichero llamado iris.csv en la carpeta pruebas de tu proyecto


  • Después, exporta los mismos datos, pero a un fichero llamado iris.xlsx en la misma carpeta
  • Has de usar la función rio::export()


  • Tienes que darle valores a dos argumentos de la función: x y file


(*) el valor de x ha de ser el objeto que quieres exportar (por ejemplo iris)

(*) el valor de file ha de ser la ruta donde quieres guardar los datos


1df <- iris

2rio::export(df, "./pruebas/iris.csv")
1
Cargamos los datos de iris en R: creamos el objeto df
2
Exportamos df a un fichero llamado iris.csv en la carpeta pruebas


df <- iris  

1rio::export(x = df,
            file = "./pruebas/iris.csv")
1
Exportamos los datos pero especificando el nombre de los argumentos x y file de la función rio::export()

Práctica: importar/exportar datos

  1. Descarga (usando código) estos datos a tu ordenador: https://raw.githubusercontent.com/perezp44/iris_data/master/data/iris.csv


  1. Importa a R esos datos que has descargado


  1. Exporta los datos a formato .xlsx y .rds


Antes de empezar limpiamos la carpeta pruebas de nuestro proyecto

fs::dir_delete("pruebas")    
fs::dir_create("pruebas")    
  1. Descargando los datos
#- en esta url hay un fichero de datos en formato .csv
my_url <- "https://raw.githubusercontent.com/perezp44/iris_data/master/data/iris.csv"

curl::curl_download(url = my_url, 
                    destfile =  "./pruebas/iris.csv")
  1. Importando los datos
my_ruta <- "./pruebas/iris.csv" 

iris <- rio::import(my_ruta)       
  1. Exportando los datos
rio::export(x = iris, file = "./pruebas/iris.xlsx")  

rio::export(x = iris, file = "./pruebas/iris.rds")  

Acceder a datos a través de API’s



  • Hay muuuuuchas organizaciones que ofrecen datos a través de API’s y …

  • … en muchas ocasiones, hay un paquete de R para acceder fácilmente a ellos!!!

Eurostat

  • Eurostat es la oficina de estadística de la Unión Europea

  • El paquete eurostat permite acceder a las API’s de Eurostat para obtener datos


  • Por ejemplo aquí puedes ver una de las múltiples tablas de datos que ofrece Eurostat; concretamente la tabla Cultural employment by sex o con siglas “cult_emp_sex”


  • ¿Importamos esa tabla a R con el paquete eurostat?
# install.packages("eurostat")
library(eurostat)

#- importamos los datos de la tabla "cult_emp_sex": "Cultural employment by sex"
df <- eurostat::get_eurostat("cult_emp_sex")   

Eurostat: importando datos en R


Si quieres probar tu mismo a bajar datos de Eurostat:


library(eurostat)

#- podemos buscar un  "tema" con la f. search_eurostat()
aa <- search_eurostat("employment", type = "all") 

#- elegimos una tabla de Eurostat
#- "hlth_silc_17": "Healthy life expectancy based on self-perceived health"
my_table <- "hlth_silc_17"  

#- da información sobre la Base de datos q hemos elegido
label_eurostat_tables(my_table) 

#-  descargamos los datos con get_eurostat()
df <- get_eurostat(my_table, time_format = "raw", keepFlags = TRUE )   

#- pone labels/etiquetas: mas legible, menos fácil de programar
df_l <- label_eurostat(df)       

Practica: importar datos de Eurostat

  • Podemos buscar un tema en Eurostat; por ejemplo aquí hay datos de “Employment and unemployment (LFS)”, aquí datos sobre “Population and social conditions” y aquí sobre “Crime and criminal justice”

  • Para mi es más cómodo buscar datos con el paquete eurostat

library(eurostat)

#- podemos buscar un  "tema" con la f. search_eurostat()
my_tema <- "employment"

aa <- eurostat::search_eurostat(pattern = my_tema, type = "all") 

#- elegimos una tabla; por ejemplo "hlth_silc_17"
my_table <- "hlth_silc_17" 

#- da información sobre la Base de datos que estas buscando
eurostat::label_eurostat_tables(my_table) 

#-  importamos los datos de "my_table" con get_eurostat()
df <- eurostat::get_eurostat(my_table, time_format = "raw", keepFlags = TRUE )   

#- pedimos los descriptores/labels de las series
df_l <- eurostat::label_eurostat(df)        

El paquete quantmod

  • Permite acceder a una gran variedad de datos económicos. Aquí tienes información


library(quantmod)  #- install.packages("quantmod")

#- For stocks and shares, the yahoo source is used. 
facebook  <- getSymbols(Symbols = 'F', src = 'yahoo', auto.assign = FALSE)  
barChart(facebook) 

#- For currencies and metals, the oanda source is used.
tc_euro_dolar <- getSymbols(Symbols = 'EUR/USD', src = 'oanda', auto.assign = FALSE)

#- For economics series, the FRED source is used. 
Japan_GDP <- getSymbols(Symbols = 'JPNNGDP', src = 'FRED', auto.assign = FALSE)

Extensiones




Formatos de datos propios de R

  • Guardar datos en formatos como .csv o .xlsx es lo más habitual si quieres abrir estos datos en otros programas, pero …

  • … pero al grabar en estos formatos guardas los datos, PERO no guardas los metadatos!!!


R tiene 2 formatos de datos propios: .rda y .rds

  • Estos formatos sí guardan los metadatos

Formato .rds

  • Exportar datos a formato .rds
rio::export(x = iris, file = "./pruebas/iris.rds")   


  • Importar datos en formato .rds
df <- rio::import(file = "./pruebas/iris.rds")

Formato .RData (o .rda)

  • El formato .RData tiene la ventaja de que puedes guardar varios objetos a la vez


  • Para exportar datos a formato .rda
#- guardamos los objetos mtcars e iris en un fichero llamado "mtcars_and_iris.RData"

save(mtcars, iris,  file = "./pruebas/mtcars_and_iris.RData")


  • Para importar datos en formato .Rda, tenemos que usar la función load()
load(file = "./pruebas/mtcars_and_iris.RData")

Bonus 1 (🌶🌶): exportar los datos de un df en un archivo .xlsx ya existente


#- bonus: le añadimos un libro mas al archivo "./pruebas/iris.xlsx"

rio::export(iris, "./pruebas/iris.xlsx")  #- por si acaso lo hubiésemos borrado


rio::export(iris, "./pruebas/iris.xlsx", which = "iris_2")

#- lo mismo pero poniendo los nombres de los argumentos
rio::export(x = iris, 
           file ="./pruebas/iris.xlsx", 
           which = "iris_3")

Bonus 2 (🌶🌶🌶🌶): exportar 2 df’s en un único archivo .xlsx


rio::export(x = list(iris = iris, 
                     pinguinos = palmerpenguins::penguins), 
            file = "./pruebas/my_iris_pinguinos.xlsx")

Bonus 3 (🌶🌶): importar una hoja/libro especifica de un archivo .xlsx


iris_1 <- rio::import("./pruebas/my_iris_pinguinos.xlsx")  #- solo importa el primer libro
  

pinguinos_1 <- rio::import("./pruebas/my_iris_pinguinos.xlsx", sheet = 2)


pinguinos_2 <- rio::import(file = "./pruebas/my_iris_pinguinos.xlsx", 
                           sheet = "pinguinos")

Webscrapping [🌶🌶🌶 🌶🌶]

  • Webscrapping consiste en obtener datos directamente de páginas web, de su código html.


Webscrapping (ejemplo 1)

  • Para obtener esos datos en R, podemos usar el paquete rvest
library(rvest)
library(tidyverse)
my_url <- "https://es.wikipedia.org/wiki/Anexo:Municipios_de_la_provincia_de_Teruel"
content <- read_html(my_url)

body_table <- content %>%
              html_nodes('body')  %>%
              html_nodes('table') %>%
              html_table(dec = ",")

#- solo hay una tabla
Teruel <- body_table[[1]]  #- estoy haciendo subsetting de una lista

disgresión: es lo mismo un data.frame que una tibble [🌶🌶🌶]

Sí y no (!!!)

  • No son exactamente lo mismo, pero para nosotros son totalmente equivalentes. Podemos pensar que las tibbles son data.frame’s modernizados o tuneados


  • Las dos son estructuras de R para almacenar datos tabulares. Si quieres ver en qué se diferencian lee esto

seleccionando “manualmente” un archivo de datos


  • Este truco es chulo … pero no hay que hacerlo
my_data <- rio::import(file.choose())


  • No hay que hacerlo si queremos que nuestros análisis sean reproducibles