Programación y manejo de datos con R
(Web del curso aquí)
¿Cómo solemos descargar unos datos?
Depende de donde estén, pero lo normal es que los datos se descarguen pinchando en un enlace.
Por ejemplo, en la siguiente ruta hay un fichero de datos en formato .xlsx
:
https://www.ine.es/daco/daco42/codmun/codmun20/20codmun.xlsx
¿Donde se descargarán esos 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
.csv
:Usaremos la función download.file()
download.file()
tiene varios argumentos. Nos centramos en los 2 primeros: url
y destfile
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”)
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")
my_url
pruebas
donde guardaremos los datos
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
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)
my_ruta
el sitio donde guardaremos los datos
curl::curl_download()
para descargar el fichero. Es una función más moderna que download.file()
podemos usar/cargar datos de los paquetes
… 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
flows
que está en el paquete refugees
refugees
es un paquete que no está en R-baseinstall.packages("refugees")
library(refugees)
flows
1my_flows_2 <- refugees::flows
flows
sin cargar todo el paquete
Los datos más habituales en Ciencias Sociales son los datos tabulares
.csv
, .xlsx
, .sav
, .dta
, etc …Cuando carguemos/importemos esos datos tabulares en R …
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
rio::import()
rio::export()
importando datos con rio::import()
rio::import()
tiene varios argumentos, pero solo usaremos el primero.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!!file
ha de ser la ruta (de nuestro ordenador) donde están los datos que queremos importarTarea: importar a R datos que tenemos guardados en nuestro ordenador
./pruebas/plazas_turisticas.csv
?rio::import()
file
) has de especificar la ruta donde están los datos"./pruebas/plazas_turisticas.csv"
my_ruta <- "./pruebas/plazas_turisticas.csv"
1df <- rio::import(file = my_ruta)
file
) como el valor del argumento (my_ruta
)
Una vez tenemos los datos en R …
… imagina que alguien nos pide esos datos limpios
¿Qué hacemos?
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.
x
(su valor ha de ser un objeto/datos de R que queremos exportar)file
(su valor ha de ser la ruta donde queremos guardar los datos)Tarea: exportar unos datos de R a un fichero
rio::export()
para exportar a un fichero (de tu ordenador) el conjunto de datos iris en formato .csvrio::export()
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
iris
en R: creamos el objeto df
df
a un fichero llamado iris.csv
x
y file
) de la función rio::export()
iris.csv
?La respuesta es “en el directorio de trabajo”
OK, pero, ¿exactamente donde?
iris.csv
en la subcarpeta “pruebas” del RprojectPráctica: importar/exportar datos
Importa a R esos datos que has descargado
Exporta los datos a formato .xlsx
y .rds
Antes de empezar limpiamos la carpeta pruebas
de nuestro proyecto
Veremos que … para gestionar/construir nuestras rutas, es conveniente usar here::here()
La razón es que favorecerá que nuestros análisis sean reproducibles
1here::here()
here::here()
devuelve la ruta al directorio de trabajo .qmd
.rda
y .rds
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
Formato .rds
.rds
Formato .RData (o .rda)
.RData
tiene la ventaja de que puedes guardar varios objetos a la vez.rda
.rda
, tenemos que usar la función load()
.rda
desde la web hay que usar load(url())
#- hay que usar load(url())
#- no funciona xq han borrado el archivo
df <- load(url("http://gedemced.uab.cat/images/POP_ENC_AMB_2014.Rdata"))
#- pero si aún así no funcionase, usa repmis::source_data()
my_url <- "https://github.com/perezp44/LAU2boundaries4spain/blob/master/data/Provincias.rda?raw=true"
df <- load(url(my_url)) #- no funciona
df <- repmis::source_data(my_url)
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
eurostat
?Practica: importar datos de Eurostat
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
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)
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")
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
rio
, pero …list()
Bonus 3 (🌶🌶): importar una hoja/libro especifica de un archivo .xlsx
rio
, pero …sheet
Bonus 4: (!!!! 😱 😱) importamos todos los libros de un archivo .xlsx
library(readxl) #- necesitamos la función readxl::excel_sheet()
mys_sheets <- readxl::excel_sheets(here::here("pruebas", "my_iris_pinguinos.xlsx"))
#- con base::lapply()
my_dfs_list <- lapply(mys_sheets,
readxl::read_excel,
path = here::here("pruebas", "my_iris_pinguinos.xlsx"))
#- con purrr::map()
my_dfs_list <- purrr::map(mys_sheets,
readxl::read_excel,
path = here::here("pruebas", "my_iris_pinguinos.xlsx"))
Bonus 5: (!!!!!!) importamos todos archivos de datos de una carpeta concreta
Webscrapping [🌶🌶🌶 🌶🌶]
Webscrapping (ejemplo 1)
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
names(Teruel) <- c("Nombre", "Poblacion", "Superficie",
"Densidad", "Altitud", "Comarca", "Partido_judicial")
library(stringr)
Teruel <- Teruel %>% map(str_trim) %>% as_tibble() #- quita caracteres al final
Teruel <- Teruel %>% mutate(Altitud = str_replace_all(Altitud,"[[:punct:]]", ""))
Teruel <- Teruel %>% mutate(Altitud = as.double(Altitud)) %>% arrange(desc(Altitud))
digresión: es lo mismo un data.frame que una tibble [🌶🌶🌶]
Sí y no (!!!)
as.data.frame()
. Puedes leerlo aquíseleccionando “manualmente” un archivo de datos
gestionando las rutas con here::here()
Problemas con las rutas “tradicionales”
C:\tu-usuario\tu-proyecto\datos\archivo.csv
"./datos/archivo.csv"
o "../scripts/codigo.R"
En realidad, como nosotros trabajamos con Rstudio y con Rproject’s, de momento nos basta con utilizar rutas relativas, PERO, esto cambiará cuando trabajemos con archivos .qmd
Rutas con here::here()
.R
como con ficheros .qmd
here::he()
las convertirá en rutas absolutas. Por ejemplo:C:\Users\my_usuario\my_Rproject\datos\my_archivo.csv
Ventajas:
setwd()
al inicio!! Tu yo futuro y tus coautores te lo agradecerán!! ✨¿cómo construir nuestra rutas con here::here()
?
iris
, hacíamos algo como:here::here()
haremos:here::here()
nos devuelve una ruta absoluta, pero diferente para cada ordenador:C:\my_usuario\my_proyecto\pruebas\iris.xlsx
vamos a usar un bucle for
… para exportar varios archivos
iris
, a varios formatos y quiero hacerlo con un “for loop”no siempre es fácil publicar bien unos datos
algunas referencias
El capítulo de importación de datos de R4DS(2ed).
El capítulo de importación de datos de R4DS.
Un buen capítulo sobre importación de datos en R.
Unas buenas transparencias de Earo Wang. Aquí están sus datos.
un caso más complejo
Para contar el nº de municipios por provincia tenemos que descargar el fichero con la relación de municipios del INE. El fichero está aquí: https://www.ine.es/daco/daco42/codmun/codmun20/20codmun.xlsx
Vamos a descargarlo de varias formas:
con el paquete rio
utilizando los menús de RStudio
con el paquete readxl
Finalmente lo haremos de forma más “pofesional”
rm(list = ls()) #- antes vamos a limpiar el Global env.
my_url <- "https://www.ine.es/daco/daco42/codmun/codmun20/20codmun.xlsx"
my_ruta_guardar <- here::here("pruebas", "20codmun.xlsx")
curl::curl_download(my_url, my_ruta_guardar) #- lo guardo en disco
df_1 <- rio::import(my_ruta_guardar) #- q pb tenemos?
Vamos a usar menús, pero que no nos vea Hadley!!!
Seguid la siguiente ruta de menús: File > Import Dataset > From Excel ...
Pegáis en la caja de texto el url
y pincháis el botón update
#- script para bajar la relación de municipios INE a 1 de enero de 2021
url_descarga <- "https://www.ine.es/daco/daco42/codmun/diccionario21.xlsx"
nombre_fichero <- "diccionario21.xlsx"
#- obtengo el nombre del archivo
nombre_fichero <- stringr::str_extract(url_descarga, "([^\\/]+$)")
#- añado la fecha de descarga al nombre de archivo
extension <- stringr::str_extract(url_descarga, "([^\\.]+$)")
nombre <- stringr::str_remove(nombre_fichero, paste0(".",extension))
nombre_fichero <- paste0(nombre , "_", Sys.Date(), ".", extension)
#- lo guardo
my_ruta <- here::here("pruebas", nombre_fichero) #- ruta para guardar el fichero
curl::curl_download(url = url_descarga, destfile = my_ruta)
seguimos con el ejemplo
aparecen muchas cosas/funciones que veremos más adelante [🌶🌶🌶🌶]