class: inverse, center, middle <br> #### Programación y manejo de datos con R (Slides 04) ## Importar (y exportar) datos con R <br> ### Pedro J. Pérez #### 2021, abril ###### (actualizadas el 04-09-2023) <br><br> #### e-mail: [<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z"></path></svg>](mailto:pedro.j.perez@uv.es) [pedro.j.perez@uv.es](mailto:pedro.j.perez@uv.es) #### Web del curso: [https://perezp44.github.io/intro-ds-23-24-web](https://perezp44.github.io/intro-ds-23-24-web) --- class: inverse, center, middle ## Importación de datos <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> #### Es la primera etapa para comenzar un análisis de datos <br> <img src="data:image/png;base64,#./imagenes/ss_05_img_01_cargar-datos.png" width="69%" style="display: block; margin: auto;" /> ??? - ya casi sabemos (rio::import()) pero ... --- ##### ¿Donde están los datos? - En muchos sitios, pero básicamente en 2: - en bases de datos (RDBMS, noSQL, etc ...): una base de datos es una herramienta que almacena datos de forma organizada. - en **ficheros** ##### Además, los datos más habituales en CC.SS son datos tabulares - formatos **tabulares**: `.csv`, `.xlsx`, `.sav` , `.dta`, etc ... - no tabulares: `.json`, `.xml`, etc ... ??? - datos hay en muchos sitios (frigorífico) pero basicamente en 2. -- <br> ##### Cuando cargemos/importemos esos datos tabulares .... - Habitualmente, se almacenarán internamente en R como **data.frames** (o **tibbles**) ??? - IMPORTANTE: df vs. tibble. Son estructuras de datos --- background-image: url(data:image/png;base64,#imagenes/rio-logo.png) background-position: 99% 1% background-size: 5% ##### Unas ideas generales - Ya sabemos que generalmente usaremos **datos tabulares** provenientes de **archivos**, que se almacenaran en R como **data.frames** -- - RStudio permite cargar datos **a través de menús** (`File > Import Dataset`). Por menús se pueden cargar datos CSV, EXCEL, SPSS, SAS y STATA. Se puede hacer, **pero no lo haremos**, ¿por qué? -- - Para importar y exportar los datos **usaremos funciones**, funciones que pertenecen a algún paquete. Podríamos usar los paquetes de R-base, pero ya sabéis que el curso está orientado al `tidyverse`. -- - Los principales paquetes del tidyverse para importar y exportar datos son: [readr](https://readr.tidyverse.org/), [haven](https://haven.tidyverse.org/) y [readxl](https://readxl.tidyverse.org/). -- ##### A pesar de ello ... usaremos el paquete rio - A pesar de ello, **usaremos el paquete `rio`** que llama/utiliza indirectamente esos paquetes y otros, lo que le permite importar y exportar ficheros en casi cualquier formato. - Como puede leerse en [su web](https://github.com/leeper/rio), el paquete **rio** es "A Swiss-Army Knife for Data I/O". -- --------------------- Bueno, ya vale de "teoría", vamos a aprender a cargar/importar datos mediante una serie de **ejemplos** --- class: inverse, center, middle ### Ejemplos: importar (y exportar) datos tabulares en ficheros <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> <br> #### Los ficheros pueden estar en ###### - un paquete de R ###### - en Internet ###### - en nuestro ordenador --- ##### Datos almacenados en los paquetes - Sí, los paquetes suelen tener funciones y documentación, pero también datos. <br> - Intenta entender que hacen las siguientes instrucciones. En nada lo explico yo. ```r #- cuanto iniciamos R se cargan automaticamente 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" str(iris) #- qué es iris? find("iris") #- [🌶] ¿donde estaba iris? my_iris <- iris #- "hacemos una copia" de iris find("my_iris") #- ¿donde está my_iris? iris <- iris #- ??? find("iris") #- ¿donde está ahora iris? ``` --- #### Ejercicio: datos almacenados en los paquetes .bg-washed-purple.b--dark-purple.ba.bw2.br3.shadow-5.ph4.mt5[ .panelset[ .panel[.panel-name[Tarea] Resulta que **quiero usar unos datos**. Los datos están el fichero de datos **penguins**, pero resulta que ese fichero de datos está en un paquete. El paquete se llama **palmerpenguins**. El paquete está en CRAN, pero si quieres ver su repo en Github, está [aquí](https://github.com/allisonhorst/palmerpenguins). <br> Bueno, **la tarea está clara**: .brown[carga en memoria los datos de los pingüinos que están en el fichero penguins dentro del paquete palmerpenguins]. 🤔️ <br> ] .panel[.panel-name[Solución] <br> - Ni se te ocurra mirar la solución hasta que lo hayas intentado!!! - te rindes? Bueno, a veces hay que rendirse, mira en el siguiente tab. ] .panel[.panel-name[Más] - Te has rendido, bueno ... 😅️ - Primero tienes que instalar el paquete, luego cargarlo en memoria y así ya puedes llamar al fichero de datos `penguins` ```r #- en el pkg palmerpenguins hay 2 conjuntos de datos library(palmerpenguins) #- install.packages("palmerpenguins") #- ya podemos usar los datos de penguins xq hemos cargado (attach) el paquete en memoria de R penguins my_penguins <- penguins #- quiero tb hablaros de la siguiente expresión #- es importante acostumbrarse a ella [ 🌟 ] palmerpenguins::penguins ``` ] ] ] --- class: inverse, center, middle background-image: url(data:image/png;base64,#imagenes/rio-logo.png) background-position: 98% 2% background-size: 7% ## Importación de datos <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> #### Vamos a usar el paquete .orange[*rio*] para cargar datos <br> --- background-image: url(data:image/png;base64,#imagenes/rio-logo.png) background-position: 99% 1% background-size: 5% ##### Importando datos con el paquete `rio` - El paquete **.orange[rio]** **tenía** solo dos funciones: **import()** y **export()**. ¿Adivinas que hace cada una de ellas? -- - Empecemos con **import()**: la función `import()` tiene varios argumentos, pero generalmente 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!! -- .bg-washed-purple.b--dark-purple.ba.bw2.br3.shadow-5.ph4.mt5[ .panelset[ .panel[.panel-name[Tarea] En esta dirección de internet: <https://raw.githubusercontent.com/perezp44/iris_data/master/data/iris.csv> hay un fichero de datos. Por favor, utiliza la función `rio::import()` para cargar esos datos en memoria de R ] .panel[.panel-name[Solución] ```r rm(list = ls()) #- antes vamos a limpiar el Global env. la_direccion <- "https://raw.githubusercontent.com/perezp44/iris_data/master/data/iris.csv" rio::import(la_direccion) #- ¿qué ha pasado??? iris <- rio::import(la_direccion) #- y ahora ¿qué ha pasado? ``` .panel[.panel-name[Solución (extended)] ```r rm(list = ls()) #- antes vamos a limpiar el Global env. la_direccion <- "https://raw.githubusercontent.com/perezp44/iris_data/master/data/iris.csv" iris_1 <- rio::import(la_direccion) #- como un data.frame iris_2 <- rio::import(la_direccion, setclass = "tibble") #- como tibble iris_3 <- tibble::as_tibble(iris_1) #- convertimos iris_1 a tibble ``` ] ] ] ] --- class: inverse, center, middle ## Exportación de datos <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> <br> #### Luego seguiremos cargando/importando datos, ahora vamos a exportar --- ##### Exportando datos con el paquete `rio` - Tenéis que usar la función **rio::export()**. Esta función también tiene varios argumentos, pero los principales son los dos primeros, llamados `"x"` y `"file"` -- .bg-washed-purple.b--dark-purple.ba.bw2.br3.shadow-5.ph4.mt5[ .panelset[ .panel[.panel-name[Tarea 1] Tendrás que apañártelas para hacer la siguiente tarea. No patixques, enseguida lo hacemos juntos, pero seguro que la mayoría sabréis sin ayuda. <br> Por favor, utiliza la función `rio::export()` para exportar a un fichero (de tu ordenador) el conjunto de datos `iris` en formato `.csv`. ] .panel[.panel-name[Solución 1] ```r rm(list = ls()) #- [🌶] antes vamos a limpiar el Global env. my_iris <- iris rio::export(my_iris, "my_iris.csv") #- sin los nombres de los argumentos rio::export(x = my_iris, file = "my_iris.csv") #- CON los nombres de los argumentos #- IMPORTANTE: ¿Donde hemos guardado my_iris? [ 🌟 ] ``` ] .panel[.panel-name[Pregunta 🌟🌟] - ¿Donde hemos guardado antes el fichero "my_iris.csv"? En el "directorio de trabajo" - ¿Directorio de trabajo? Si estamos en un proyecto de R, el "wd" es la carpeta donde reside el proyecto Si no estamos en un proyecto de R ... ] .panel[.panel-name[Tarea 2] - Si quisiéramos guardar datos en un sitio diferente del "wd", tendríamos que proveer la ruta donde queremos guardarlos - Por favor, prueba a guardar otra vez my_iris, **pero que se guarde en una subcarpeta del Rroject**, concretamente en una subcarpeta llamada `"pruebas"` (primero tendrás que crear esa carpeta) ] .panel[.panel-name[Solución 2] - Puedes crear la carpeta "pruebas" a mano, pero yo prefiero crearla con código ```r fs::dir_create("pruebas") #- [🌶] creo el subdirectorio rio::export(my_iris, "./pruebas/my_iris.csv") ``` - Perfecto, pero es mejor construir la ruta utilizando el pkg "here". Tiene ventajas, y es la forma que usaremos cuando nos acostumbremos. [ 🌟 ] ```r la_ruta <- here::here("pruebas", "my_iris.csv") rio::export(my_iris, la_ruta) rio::export(my_iris, here::here("pruebas", "my_iris.csv")) ``` ] ] ] --- ##### Seguimos exportando datos con el paquete `rio` .bg-washed-purple.b--dark-purple.ba.bw2.br3.shadow-5.ph4.mt5[ .panelset[ .panel[.panel-name[Tarea 1] - Por favor, utiliza la función `rio::export()` para exportar el conjunto de datos `iris` a varios ficheros de tu ordenador. Concretamente has de exportar `iris` a los siguientes formatos: `.csv`, `.xlsx` y `.sav`. ] .panel[.panel-name[Solución 1] ```r rio::export(iris, here::here("pruebas", "iris.csv")) rio::export(iris, here::here("pruebas", "iris.xlsx")) rio::export(iris, here::here("pruebas", "iris.sav")) ``` ] .panel[.panel-name[Tarea 2] - Por favor, utiliza la función `rio::export()` para **exportar** el conjunto de .yellow-h[datos `penguins` del paquete `palmerpenguins`] a varios ficheros de tu ordenador. Concretamente has de exportar los datos de los pingüinos a los siguientes formatos: `.csv`, `.xlsx` y `.dta`. ] .panel[.panel-name[Solución 2] ```r rio::export(palmerpenguins::penguins, here::here("pruebas", "pinguinos.csv")) rio::export(palmerpenguins::penguins, here::here("pruebas", "pinguinos.xlsx")) rio::export(palmerpenguins::penguins, here::here("pruebas", "pinguinos.dta")) ``` ] ] ] -- <br><br> - Vamos a volver a hacer la Tarea 1, **pero à la PRO**: vamos a usar un bucle FOR (any ideas??) --- class: inverse, center, middle ## Volvemos a IMPORTAR <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> -- #### Vamos a importar los ficheros que hemos creado previamente. --- ##### Seguimos importando datos con el paquete `rio` .bg-washed-purple.b--dark-purple.ba.bw2.br3.shadow-5.ph4.mt5[ .panelset[ .panel[.panel-name[Tarea 1] - Por favor, utiliza la función `rio::import()` para importar (cargar en memoria) los datos que hay en el fichero `"./pruebas/iris.csv"` - Después importa los datos del fichero: `"./pruebas/iris.xlsx"` ] .panel[.panel-name[Solución 1] ```r rm(list = ls()) iris_1 <- rio::import(here::here("pruebas", "iris.csv")) iris_2 <- rio::import(here::here("pruebas", "iris.xlsx")) ``` ] .panel[.panel-name[Tarea 2] - Por favor, utiliza la función `rio::import()` para importar los datos que haya en el fichero: `"./pruebas/pinguinos.csv"`. - Después importa los datos del fichero: `"./pruebas/pinguinos.xlsx"` - Después importa los datos del fichero: `"./pruebas/pinguinos.dta"` ] .panel[.panel-name[Solución 2] Esta vez ya no hay solución!!! Tienes que acostumbrarte a escribir en R. Ya te manejas leyendo, PERO hay que empezar a escribir!! ] ] ] --- background-image: url(data:image/png;base64,#imagenes/hot-pepper_1f336.png) background-position: 99% 1% background-size: 3% ##### Una última cosa Es importante que diferenciéis entre .orange[descargarse un fichero] y .brown[cargar el fichero en R], cargar el fichero en memoria de R (en el Global) -- - Con **download.file()** .orange[descargamos] (y por lo tanto guardamos) los datos en un fichero de nuestro ordenador ```r #- en esta url hay un fichero de datos en formato .csv my_url <- "https://raw.githubusercontent.com/perezp44/iris_data/master/data/iris.csv" download.file(url = my_url, destfile = "./pruebas/iris_descargado.csv") curl::curl_download(url = my_url, destfile = here::here("pruebas", "iris_descargado.csv")) ``` -- <br> - Con **rio::import()** .brown[cargamos los datos en memoria de R], en el Global, pero no los guardamos. ```r aa <- rio::import(my_url) ``` -- - Obviamente, una vez tenemos los datos en el Global, siempre podemos guardarlos con `rio::export()` --- class: inverse, center, middle background-image: url(data:image/png;base64,#imagenes/hot-pepper_1f336.png) background-position: 99% 1% background-size: 3% ## Algunos BONUS de I/O <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> <br> #### Con lo que hemos visto hasta ahora nos apañamos, pero conviene ver alguna cosa más ... --- ##### Bonus 1: exportar los datos de un df en un archivo `.xlsx` ya existente. ```r #- 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") rio::export(x = iris, file = here::here("pruebas", "iris.xlsx"), which = "iris_3") ``` -- <br> ---------------- <br> ##### Bonus 2: (!!) exportar 2 df's en un único archivo `.xlsx` ```r rio::export(x = list(iris = iris, pinguinos = palmerpenguins::penguins), file = here::here("pruebas", "my_iris_pinguinos.xlsx")) ``` --- ##### Bonus 3: (!!) importar una hoja/libro especifica de un archivo `.xlsx` ```r iris_1 <- rio::import(here::here("pruebas", "my_iris_pinguinos.xlsx")) #- solo importa el primer libro pinguinos_1 <- rio::import(here::here("pruebas", "my_iris_pinguinos.xlsx"), sheet = 2) pinguinos_2 <- rio::import(here::here("pruebas", "my_iris_pinguinos.xlsx"), sheet = "pinguinos") ``` <br> --- ##### Bonus 4: (!!!!) importamos todos los libros de un archivo `.xlsx` ```r library(readxl) #- necesitamos 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")) ``` <br> -- - OK, pero tenemos los 2 data.frames dentro de una lista ¿qué hacemos? ```r #- Extrayendo un data.frame de una lista: con [[]] my_iris <- my_dfs_list2[[1]] ``` --- ##### Bonus 5: (!!!!!!) importamos todos archivos de datos de una carpeta concreta <br> - Por ejemplo, vamos a cargar en memoria de R todos los ficheros de datos que tenemos en la carpeta `"pruebas"` ```r #- importamos todos los archivos que hemos creado en "./pruebas/" *library(purrr) my_carpeta <- here::here("pruebas") lista_de_archivos <- list.files(my_carpeta) #- Ok con base ... lista_de_archivos <- fs::dir_ls(my_carpeta) #- pero mejor con el pkg "fs" my_dfs_list_2 <- map(lista_de_archivos, rio::import) ``` --- background-image: url(data:image/png;base64,#imagenes/hot-pepper_1f336.png) background-position: 99% 1% background-size: 3% ##### Vamos a dejar limpia la carpeta `"./pruebas/"` ```r #- vamos a limpiar el Rproject: vamos a borrar los archivos q hemos creado: list.files("./pruebas") #- listado de archivos en la carpeta "./pruebas" file.remove("./pruebas/pinguinos.dta") #- borramos un archivo #- borramos todos los archivos de ./pruebas/ file.remove(file.path("./pruebas", list.files("./pruebas"))) #- borramos toda la carpeta con el pkg fs fs::dir_delete("pruebas") ``` --- class: inverse, center, middle ### Aún tenemos que ver alguna cosa más <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> -- <br> #### Formatos de datos propios de R -- #### Obtener datos a través de API's -- #### Webscrapping --- ##### Formatos de datos propios de <svg viewBox="0 0 581 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M581 226.6C581 119.1 450.9 32 290.5 32S0 119.1 0 226.6C0 322.4 103.3 402 239.4 418.1V480h99.1v-61.5c24.3-2.7 47.6-7.4 69.4-13.9L448 480h112l-67.4-113.7c54.5-35.4 88.4-84.9 88.4-139.7zm-466.8 14.5c0-73.5 98.9-133 220.8-133s211.9 40.7 211.9 133c0 50.1-26.5 85-70.3 106.4-2.4-1.6-4.7-2.9-6.4-3.7-10.2-5.2-27.8-10.5-27.8-10.5s86.6-6.4 86.6-92.7-90.6-87.9-90.6-87.9h-199V361c-74.1-21.5-125.2-67.1-125.2-119.9zm225.1 38.3v-55.6c57.8 0 87.8-6.8 87.8 27.3 0 36.5-38.2 28.3-87.8 28.3zm-.9 72.5H365c10.8 0 18.9 11.7 24 19.2-16.1 1.9-33 2.8-50.6 2.9v-22.1z"></path></svg> - 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**; por ejemplo, si una columna la has definido como un factor o como integer, esta información se perderá. En estos casos, una solución es usar los formatos propios de R. -- <br> ##### <svg viewBox="0 0 581 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M581 226.6C581 119.1 450.9 32 290.5 32S0 119.1 0 226.6C0 322.4 103.3 402 239.4 418.1V480h99.1v-61.5c24.3-2.7 47.6-7.4 69.4-13.9L448 480h112l-67.4-113.7c54.5-35.4 88.4-84.9 88.4-139.7zm-466.8 14.5c0-73.5 98.9-133 220.8-133s211.9 40.7 211.9 133c0 50.1-26.5 85-70.3 106.4-2.4-1.6-4.7-2.9-6.4-3.7-10.2-5.2-27.8-10.5-27.8-10.5s86.6-6.4 86.6-92.7-90.6-87.9-90.6-87.9h-199V361c-74.1-21.5-125.2-67.1-125.2-119.9zm225.1 38.3v-55.6c57.8 0 87.8-6.8 87.8 27.3 0 36.5-38.2 28.3-87.8 28.3zm-.9 72.5H365c10.8 0 18.9 11.7 24 19.2-16.1 1.9-33 2.8-50.6 2.9v-22.1z"></path></svg> tiene 2 formatos de datos propios: .rds y .rda - **Rds**: si quieres grabar un solo objeto, es preferible hacerlo como `.Rds` - **Rda**: si quieres grabar varios objetos tienes que hacerlo como `RData` o abreviado como `.Rda` --- ##### Formato .RData (o .Rda) El formato `.RData` tiene la ventaja de que **puedes guardar varios objetos a la vez**. Una “desventaja” del formato RData es que al importar un fichero .RData, los objetos que contiene se cargan siempre con el nombre con el que fueron grabados. -- <br><br> - Para exportar datos a formato `.Rda` ```r save(mtcars, iris, file = here::here("pruebas", "mtcars_and_iris.RData") ``` <br> - Para importar datos en formato `.Rda`: tienes que usar la función `load()` ```r load(here::here("pruebas", "mtcars_and_iris.RData")) ``` <br> --- ##### Formato .rds <br> - (3 formas de) **Exportar** datos a formato `.rds` ```r saveRDS(iris, here::here("pruebas", "iris_1.rds")) #- con base-R readr::write_rds(iris, here::here("pruebas", "iris_2.rds")) #- con pkg "readr" *rio::export(iris, here::here("pruebas", "iris_3.rds")) ``` -- <br> - (3 formas de) **Importar** datos en formato `.rds` ```r my_iris_1 <- readRDS(here::here("pruebas", "iris_1.rds")) #- con R-base my_iris_2 <-readr::read_rds(here::here("pruebas", "iris_2.rds")) #- tidyverse *my_iris_3 <- rio::import(here::here("pruebas", "iris_3.rds")) ``` --- class: inverse, center, middle ### Acceder a datos a través de API's <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> -- ###### Hay muuuuuchas organizaciones que ofrecen datos a traves de API's y ... ###### ... en muchas ocasiones, hay un paquete de R para acceder fácilmente a ellos!!! --- ##### Eurostat - Por ejemplo el paquete [`eurostat`](https://ropengov.github.io/eurostat/) permite acceder a las API's de Eurostat ```r # install.packages("eurostat") library(eurostat) df <- get_eurostat("cult_emp_sex", time_format = 'raw', keepFlags = T) #- bajamos los datos de la tabla "cult_emp_sex": empleo cultural por genero" ``` -- <br> ##### Si quieres probar tu mismo a bajar datos de Eurostat: ```r library(eurostat) #- podemos buscar un "tema" con la f. search_eurostat() aa <- search_eurostat("employment", type = "all") #- elegimos una tabla de Eurostat my_table <- "hlth_silc_17" #- elegimos una tabla; por ejemplo "hlth_silc_17": "Healthy life expectancy based on self-perceived health" label_eurostat_tables(my_table) #- da informacion sobre la Base de datos q estas buscando #- descargamos los datos con get_eurostat() df <- get_eurostat(my_table, time_format = "raw", keepFlags = TRUE ) #- bajamos los datos de una tabla df_l <- label_eurostat(df) #- pone labels: mas legible, menos fácil de programar ``` --- ##### El paquete [`quantmod`](http://www.quantmod.com/) <br> Permite acceder a una gran variedad de datos económicos. [Aquí](https://www.quantmod.com/) está su web. ```r 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) ``` --- class: inverse, center, middle ## Webscrapping <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> #### Obtener datos directamente de páginas web, de su código html. --- ##### Webscrapping (ejemplo 1) - Pueblos más "altos" de Teruel: [aquí](https://es.wikipedia.org/wiki/Anexo:Municipios_de_la_provincia_de_Teruel) puedes ver la tabla ```r 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 ``` -- - Vamos a arreglar un poco la tabla ```r names(Teruel) <- c("Nombre", "Extension", "Poblacion", "Densidad", "Comarca", "Partido_judicial", "Altitud") 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)) ``` --- ##### Webscrapping (ejemplo 2) <br> - Covid: en [esta página](https://es.wikipedia.org/wiki/Pandemia_de_enfermedad_por_coronavirus_de_2020_en_Espa%C3%B1a) tenemos datos sobre covid. ```r library(rvest) library(tidyverse) my_url <- "https://es.wikipedia.org/wiki/Pandemia_de_enfermedad_por_coronavirus_de_2020_en_Espa%C3%B1a" content <- read_html(my_url) body_table <- content %>% html_nodes('body') %>% html_nodes('table') %>% html_table(dec = ",", fill = TRUE) #- la página web tiene 9 tablas tabla_7 <- body_table[[7]] tabla_8 <- body_table[[8]] ``` -- <br> Un [artículo](https://github.com/mdogucu/web-scrape) donde se valoran las ventajas e inconvenientes de introducir Web scrapping en el curriculum --- class: inverse, center, middle ## Hagamos un caso un poco más complejo <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> #### Lo tenéis que hacer vosotros y cuenta para nota (😜) --- ##### Os propongo el siguiente ejercicio: - Resulta que quiero saber que provincia tiene más municipios, así que me voy al INE, concrétamente [aquí](https://www.ine.es/daco/daco42/codmun/codmunmapa.htm). En esa página hay un fichero que nos permitirá contar el nº de municipios. -- .bg-washed-purple.b--dark-purple.ba.bw2.br3.shadow-5.ph4.mt5[ .panelset[ .panel[.panel-name[Tarea] Hay 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> - Primero vamos a hacerlo con el paquete `rio` - Después vamos a ver como podríamos importarlo con menús (que no nos vea Hadley!!) - Después lo haremos con el paquete `readxl` - Por último la haremos un poco más "profesional" ] .panel[.panel-name[Solución 1 (con rio)] - Primero con el paquete `rio` ```r 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? ``` - ¿Qué problema tenemos? ] .panel[.panel-name[Solución 2 (por menús)] - 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` - .... ] .panel[.panel-name[Solución 3 (con `readxl`)] ```r df_2 <- readxl::read_xlsx(my_url, skip = 1) #- no funciona. solo lee del PC my_ruta_guardar <- here::here("pruebas", "20codmun.xlsx") df_2 <- readxl::read_xlsx(my_ruta_guardar, skip = 1) ``` ] ] ] --- background-image: url(data:image/png;base64,#imagenes/hot-pepper_1f336.png) background-position: 99% 1% background-size: 3% ##### Podemos hacerlo un poco más "profesional", por ejemplo ... - Descargo el archivo de forma más profesional [🌶🌶🌶🌶🌶] ```r #- 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) ``` -- - Importo el fichero a la memoria de R ```r df <- readxl::read_xlsx(path = my_ruta, skip = 1) #- la verdad es que skip = 1 también hubiese funcionado con el paquete `rio` #- ya que `rio` llama a `readxl` ``` --- background-image: url(data:image/png;base64,#imagenes/hot-pepper_1f336.png) background-position: 99% 1% background-size: 3% ##### ... seguimos con el ejemplo - Arreglo los datos a mi gusto [🌶] ```r library(tidyverse) df <- df %>% mutate(ine_muni = paste0(CPRO, CMUN)) %>% mutate(year = "2021") %>% #- !! cómo lo guardaría? mutate(year = as.numeric(year)) %>% rename(ine_muni.n = NOMBRE) %>% rename(ine_prov = CPRO) %>% select(ine_muni, ine_muni.n, ine_prov, year) str(df) ``` <br> - Exporto el archivo (por si lo quiero guardar) ```r readr::write_csv(df, file = here::here("pruebas", "my_relacion_muni_2021.csv")) ``` --- background-image: url(data:image/png;base64,#imagenes/hot-pepper_1f336.png) background-position: 99% 1% background-size: 6% ##### Como véis no he contado el nº de municipios por provincia - Se puede hacer de varias maneras, abajo tienes 2: ```r df_muni <- df %>% group_by(ine_prov) %>% summarise(numero_muni = n()) df_muni <- df %>% count(ine_prov) ``` -- ##### Si quisiéramos saber el nombre de las provincias ... - Tendríamos que cargar un nuevo fichero con esa información: ```r #- pak::pak("perezp44/pjpv.curso.R.2022") codigos_prov <- pjpv.curso.R.2022::ine_pob_mun_1996_2021 %>% select(ine_prov, ine_prov.n) %>% distinct() ``` - Para finalmente fusionar los 2 ficheros: ```r #- fusiono los 2 ficheros (lo veremos!!) df_ok <- left_join(df_muni, codigos_prov) ``` -- - Borro la carpeta `pruebas` para dejar el Rproject limpio ```r fs::dir_delete("pruebas") #- [🌶] borro la carpeta pruebas ``` --- class: inverse, center, middle ### Algunas cosas más sobre importación de datos [🌶🌶🌶] <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> #### Son una miscelanea de tópicos sueltos, curiosidades, etc ... --- ##### disgresión: es lo mismo un data.frame que una tibble [🌶🌶🌶] - Sí y no (!!!). Para nosotros serán equivalentes. Podemos pensar que las tibbles son data.frame's modernizados o tuneados. - Las dos son estructuras de R para almacenar datos. Si quieres ver en qué se diferencian ve [aquí](https://tibble.tidyverse.org/) ```r typeof(iris) #> [1] "list" class(iris) #> [1] "data.frame" names(attributes(iris)) #> [1] "names" "class" "row.names" iris_2 <- tibble::as_tibble(iris) typeof(iris_2) #> [1] "list" class(iris_2) #> [1] "tbl_df" "tbl" "data.frame" names(attributes(iris_2)) #> [1] "class" "row.names" "names" ``` - Alguna funciones antiguas puede que no funcionen con tibbles. Si te pasa esto, tienes que usar `as.data.frame()`. Puedes leerlo [aquí](https://r4ds.had.co.nz/tibbles.html) --- ##### no siempre es fácil publicar bien unos datos .pull-left[ - Por ejemplo [este tweet](https://twitter.com/jescuderoma/status/1375030727373430789/photo/1) <img src="data:image/png;base64,#../imagenes/ss_04_tweet-de-datos.png" width="69%" style="display: block; margin: auto;" /> ] .pull-right[ - Una [guía](https://datos.gob.es/es/documentacion/guia-practica-para-la-publicacion-de-datos-tabulares-en-archivos-csv) para publicar datos en .csv. [Aquí](https://datos.gob.es/sites/default/files/doc/file/cheat_sheet_csv_vf.pdf) la cheatsheet - Un [buen post](http://r4stats.com/2018/03/28/using-excel-for-data-entry/) sobre la misma temática ] --- ##### para descargar ficheros es mejor usar curl::curl() - curl::curl() mejor que download.file(). Razones [aquí](https://github.com/jeroen/curl). ```r curl::curl_download( url = "https://direccion-al-archivo.gpx", destfile = "./datos/pruebas/my_archivo.gpx") ``` ##### si desde R quieres importar/exportar a Excel ... - Si desde R quieres leer/escribir ficheros de Excel complejos, quizás ahora mismo el mejor pquete para ello es [openxlsx](https://ycphs.github.io/openxlsx/). Además ya no depende de Java. ##### ¿por qué usar here::here()? - Es denso, pero el mejor [post](https://malco.io/2018/11/05/why-should-i-use-the-here-package-when-i-m-already-using-projects/) que he leído sobre el tema. ##### Para cargar .Rda desde la web ```r #- hay que usar load(url()) df <- load(url('http://gedemced.uab.cat/images/POP_ENC_AMB_2014.Rdata')) #- pero si no funciona, 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) ``` --- ##### el buscador de datos de Google - Os puede servir para vuestros trabajos: <https://datasetsearch.research.google.com/> <br> ##### selecciónando manualmente un archivo de datos - Este truco es chulo ... pero no hay que hacerlo ```r my_data <- rio::import(file.choose()) ``` --- ##### algunas referencias - El [capítulo](https://r4ds.had.co.nz/data-import.html) de importación de datos de R4DS. - Un [buen capítulo](https://ubc-dsci.github.io/introduction-to-datascience/reading.html) sobre importación de datos en R. - Muy [buen tutorial](https://mgimond.github.io/ES218/Week02b.html) - Unas [buenas transparencias](https://stats220.earo.me/02-import-export.html#1) de Earo Wang. [Aquí](https://stats220.earo.me/pages/data/) están sus datos.