Descargar,
importar (y exportar)
datos con R

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

Descargar datos con R



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 solemos descargar unos datos?


¿Y cómo se descargan datos con R?

  • Usando código

  • Al principio es un poco más complicado, pero tiene ventajas, y además estamos aprendiendo 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. Usaremos la función download.file()

  2. download.file() tiene varios argumentos. Nos centramos en los 2 primeros: url y destfile


  1. Tendrás que dar valores a esos dos argumentos:

    • el url donde está el fichero de datos

    • la ruta de tu ordenador donde quieres guardar los datos. (Lo guardaremos en la subcarpeta “pruebas”)


  1. Recuerda que estamos trabajando con proyectos, así que podemos usar rutas relativas
my_url <- "https://raw.githubusercontent.com/perezp44/archivos_download/refs/heads/master/plazas_turisticas.csv"


download.file(my_url, "plazas_turisticas.csv")

download.file(url = my_url,                               
              destfile = "plazas_turisticas.csv")       



  • ¿Donde se guardarán los datos?
  • Vamos a ser organizados y guardar los datos en uns subcarpeta que llamaremos “pruebas”
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


… 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 flows que está en el paquete refugees


  • refugees es un paquete que no está en R-base


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


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


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


1library(refugees)

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


1my_flows_2 <- refugees::flows
1
Es una forma alternativa de cargar los datos de flows sin cargar todo el paquete

… seguimos importando



  • 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 Ciencias Sociales 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 single-file .zip or .tar archive”.   WTF!!


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


  • Bueno, … en realidad también podemos importar directamente desde un “url”


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 tanto el nombre del argumento (file) como el valor del argumento (my_ruta)

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, utiliza la función rio::export() para exportar a un fichero (de tu ordenador) el conjunto de datos iris en formato .csv
  • 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, "iris.csv")

3rio::export(x = df,
            file = "iris.csv")
1
Cargamos los datos de iris en R: creamos el objeto df
2
Exportamos df a un fichero llamado iris.csv
3
Hace lo mismo que 2, pero ahora especificamos los nombres de los argumentos ( x y file) de la función rio::export()
  • ¿Donde se ha guardado iris.csv?
  • La respuesta es “en el directorio de trabajo”

  • OK, pero, ¿exactamente donde?

  • Como estamos trabajando en un Rproject, el directorio de trabajo es la propia carpeta del proyecto
  • Por favor, guarda/graba iris.csv en la subcarpeta “pruebas” del Rproject


rio::export(df, "./pruebas/iris.csv") 

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

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

  2. 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")   

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. ¿Probamos?
library(eurostat)

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

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

#- elegimos un dataset; 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




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

digresió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

Más extensiones


Bonus 1 (🌶🌶 … 🌶): exportar los datos de un df a 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")


  • Esta solución ya no funciona 😱 !!
  • Tendremos que usar nuevo paquete: openxlsx
#- tenemos que usar el pkg openxlsx
library(openxlsx) #- pak::pak("openxlsx")

#- tenemos que crear un "Woorkbook" con la f. loadWorkbook()
my_workbook <- openxlsx::loadWorkbook("./pruebas/iris.xlsx")

#- ahora añadimos hojas/sheets al Woorkbook
openxlsx::addWorksheet(my_workbook, "iris_2")
openxlsx::addWorksheet(my_workbook, "my_mtcars")

#- ahora escribimos datos en las nuevas hojas/sheets q hemos creado
openxlsx::writeData(my_workbook, sheet = "iris_2",    x = iris)
openxlsx::writeData(my_workbook, sheet = "my_mtcars", x = mtcars)

#- exportamos/guardamos el archivo (con las nuevas sheets)
openxlsx::saveWorkbook(my_workbook, "./pruebas/iris.xlsx", overwrite = TRUE)

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


  • Seguimos usando el paquete rio, pero …
      … los objetos que queremos exportar se incluyen dentro de la función list()


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

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


  • Seguimos usando el paquete rio, pero …
      … tenemos que usar un nuevo argumento: sheet


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 = "my_pinguinos")