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
formatos tabulares: .csv
, .xlsx
, .sav
, .dta
, etc ...
no tabulares: .json
, .xml
, etc ...
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
formatos tabulares: .csv
, .xlsx
, .sav
, .dta
, etc ...
no tabulares: .json
, .xml
, etc ...
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é?
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
.
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, haven y readxl.
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, haven y readxl.
A pesar de ello, vamos a usar un paquete que, sin que lo veamos, llama/utiliza indirectamente esos paquetes y otros, y que permite importar y exportar ficheros en casi cualquier formato.
Utilizaremos el paquete rio
. En su web pone que el paquete rio es "A Swiss-Army Knife for Data I/O".
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, haven y readxl.
A pesar de ello, vamos a usar un paquete que, sin que lo veamos, llama/utiliza indirectamente esos paquetes y otros, y que permite importar y exportar ficheros en casi cualquier formato.
Utilizaremos el paquete rio
. En su web pone que 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
???
un paquete de R
en Internet
en nuestro ordenador
#- 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 irisfind("my_iris") #- ¿donde está my_iris?iris <- iris #- ???find("iris") #- ¿donde está ahora iris?
Resulta que quiero usar unos 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í.
Bueno, la tarea está clara: carga en memoria los datos de los pingüinos, el fichero penguins
.
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.
penguins
#- en el pkg palmerpenguins hay 2 conjuntos de datoslibrary(palmerpenguins) #- install.packages("palmerpenguins")#- ya podemos usar los datos de penguins xq hemos cargado (attach) el paquete en memoria de Rpenguinsmy_penguins <- penguins#- quiero tb hablaros de la siguiente expresión #- es importante acostumbrarse a ella [ 🌟 ]palmerpenguins::penguins
rio
rio
solo tiene dos funciones: import()
y export()
. ¿Adivinas que hace cada una de ellas?rio
rio
solo tiene 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 es: "A character string naming a file, URL, or single-file .zip or .tar archive". WTF!!
rio
rio
solo tiene 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 es: "A character string naming a file, URL, or single-file .zip or .tar archive". WTF!!
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
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?
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.frameiris_2 <- rio::import(la_direccion, setclass = "tibble") #- como tibbleiris_3 <- tibble::as_tibble(iris_1) #- convertimos df_1 a tibble
rio
"x"
y "file"
rio
"x"
y "file"
01:00
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.
Por favor, utiliza la función rio::export()
para exportar a un fichero (de tu ordenador) el conjunto de datos iris
en formato .csv
.
rm(list = ls()) #- [🌶] antes vamos a limpiar el Global env.my_iris <- irisrio::export(my_iris, "my_iris.csv") #- sin los nombres de los argumentosrio::export(x = my_iris, file = "my_iris.csv") #- CON los nombres de los argumentos#- IMPORTANTE: ¿Donde hemos guardado my_iris? [ 🌟 ]
¿Donde hemos guardado antes el fichero "my_iris.csv"? En el "directorio de trabajo"
Puedes guardar ahora 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)
fs::dir_create("pruebas") #- [🌶] creo el subdirectoriorio::export(my_iris, "./pruebas/my_iris.csv")
la_ruta <- here::here("pruebas", "my_iris.csv")rio::export(my_iris, la_ruta)rio::export(my_iris, here::here("pruebas", "my_iris.csv"))
rio
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
.
rio::export(iris, here::here("pruebas", "iris.csv"))rio::export(iris, here::here("pruebas", "iris.xlsx"))rio::export(iris, here::here("pruebas", "iris.sav"))
Por favor, utiliza la función rio::export()
para exportar el conjunto de 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
.
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"))
rio
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"
rm(list = ls())iris_1 <- rio::import(here::here("pruebas", "iris.csv"))iris_2 <- rio::import(here::here("pruebas", "iris.xlsx"))
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"
Esta vez ya no hay solución!!! Tienes que acostumbrarte a escribir en R.
Ya te manejas leyendo, PERO hay que empezar a escribir!!
Es importante que diferenciéis entre descargarse un fichero y cargar el fichero en R, cargar el fichero en memoria de R
download.file()
descargamos el fichero y lo guardamos en un fichero en nuestro ordenador#- en esta url hay un fichero de datos en formato .csvmy_url <- "https://raw.githubusercontent.com/perezp44/iris_data/master/data/iris.csv"download.file(url = my_url, destfile = here::here("pruebas", "iris_descargado.csv"))
rio::import()
NO guardamos el fichero, sino que lo cargamos en memoria de R, en el Global Env.aa <- rio::import(my_url)
.xlsx
ya existente.#- bonus: le añadimos un libro mas al archivo "./pruebas/iris.xlsx"rio::export(x = iris, file = here::here("pruebas", "iris.xlsx"), which = "iris_2")
.xlsx
ya existente.#- bonus: le añadimos un libro mas al archivo "./pruebas/iris.xlsx"rio::export(x = iris, file = here::here("pruebas", "iris.xlsx"), which = "iris_2")
.xlsx
rio::export(x = list(iris = iris, pinguinos = palmerpenguins::penguins), file = here::here("pruebas", "my_iris_pinguinos.xlsx"))
.xlsx
iris_1 <- rio::import(here::here("pruebas", "my_iris_pinguinos.xlsx")) #- solo importa el primer libropinguinos_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")
.xlsx
library(readxl)my_dfs_list <- lapply(excel_sheets(here::here("pruebas", "my_iris_pinguinos.xlsx")), read_excel, path = here::here("pruebas", "my_iris_pinguinos.xlsx"))
.xlsx
library(readxl)my_dfs_list <- lapply(excel_sheets(here::here("pruebas", "my_iris_pinguinos.xlsx")), read_excel, path = here::here("pruebas", "my_iris_pinguinos.xlsx"))
"pruebas"
#- 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)
"./pruebas/"
#- 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 fsfs::dir_delete("pruebas")
Formatos de datos propios de R
Formatos de datos propios de R
Obtener datos a través de API's
Formatos de datos propios de R
Obtener datos a través de API's
Webscrapping
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.
si quieres grabar un solo objeto, es preferible hacerlo como .Rds
si quieres grabar varios objetos tienes que hacerlo como RData
o abreviado como .Rda
El formato .RData
tienen 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.
.Rda
save(mtcars, iris, file = here::here("pruebas", "mtcars_and_iris.RData")
.Rda
: tienes que usar la función load()
load(here::here("pruebas", "mtcars_and_iris.RData"))
.rds
saveRDS(iris, here::here("pruebas", "iris_1.rds")) #- con base-Rreadr::write_rds(iris, here::here("pruebas", "iris_2.rds")) #- con pkg "readr"rio::export(iris, here::here("pruebas", "iris_3.rds"))
.rds
my_iris_1 <- readRDS(here::here("pruebas", "iris_3.rds")) #- con R-basemy_iris_1 <-readr::read_rds(here::here("pruebas", "iris_3.rds")) #- tidyversemy_iris_2 <- rio::import(here::here("pruebas", "iris_3.rds"))
# 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"
# install.packages("eurostat")library(eurostat)#- podemos buscar un "tema" con la f. search_eurostat()aa <- search_eurostat("employment", type = "all") #- elegimos una tabla de Eurostatmy_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 tabladf_l <- label_eurostat(df) #- pone labels: mas legible, menos fácil de programar
quantmod
Permite acceder a una gran variedad de datos económicos. Aquí está su web.
library(quantmod) #- install.packages("quantmod")#- For stocks and shares, the yahoo source is used. facebook <- getSymbols(Symbols = 'FB', src = 'yahoo', auto.assign = FALSE) #- For currencies and metals, the oanda source is used. Stc_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)
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 tablaTeruel <- body_table[[1]] #- estoy haciendo subsetting de una lista
names(Teruel) <- c("Nombre", "Extension", "Poblacion", "Densidad", "Comarca", "Partido_judicial", "Altitud")library(stringr)Teruel <- Teruel %>% map(str_trim) %>% as_tibble() #- quita caracteres al finalTeruel <- Teruel %>% mutate(Altitud = str_replace_all(Altitud,"[[:punct:]]", "")) Teruel <- Teruel %>% mutate(Altitud = as.double(Altitud)) %>% arrange(desc(Altitud))
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 10 tablas, seleccionamos 2 tabla_6 <- body_table[[6]] tabla_7 <- body_table[[7]]
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"
rio
rm(list = ls()) #- antes vamos a limpiar el Global env.my_url <- "https://www.ine.es/daco/daco42/codmun/codmun20/20codmun.xlsx"download.file(my_url, here::here("pruebas", "ine_rel_muni.xlsx")) #- lo guardo en discodf_1 <- rio::import(my_url)
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
....
df_2 <- readxl::read_xlsx(my_url, skip = 1) #- no funciona. solo lee del PCdf_2 <- readxl::read_xlsx(here::here("pruebas", "ine_rel_muni.xlsx"), skip = 1)
#- 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"fs::dir_create("tmp") #- creo un directorio temporalmy_ruta <- here::here("tmp", nombre_fichero) #- ruta para guardar el ficherocurl::curl_download(url = url_descarga, destfile = my_ruta)
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`
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)
readr::write_csv(df, file = here::here("tmp", "my_relacion_muni_2021.csv"))
df_muni <- df %>% group_by(ine_prov) %>% summarise(numero_muni = n())df_muni <- df %>% count(ine_prov)
codigos_prov <- pjpv.datos.01::pob_prov_1996_2020 %>% filter(year == 2020)str(codigos_prov)
#- fusiono los 2 ficheros (lo veremos!!)df_ok <- left_join(df_muni, codigos_prov)
tmp
para dejar el Rproject limpiofs::dir_delete("tmp") #- [🌶] borro el directorio temporal
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í
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"
as.data.frame()
. Puedes leerlo aquícurl::curl_download( url = "https://direccion-al-archivo.gpx", destfile = "./datos/pruebas/my_archivo.gpx")
#- 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 funcionadf <- repmis::source_data(my_url)
my_data <- rio::import(file.choose())
El capítulo de importación e datos de R4DS.
Un buen capítulo sobre importación de datos en R.
Muy buen tutorial
Unas buenas transparencias de Earo Wang. Aquí están sus datos.
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
o | Tile View: Overview of Slides |
s | Toggle scribble toolbox |
Alt + f | Fit Slides to Screen |
Esc | Back to slideshow |
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
formatos tabulares: .csv
, .xlsx
, .sav
, .dta
, etc ...
no tabulares: .json
, .xml
, etc ...
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
formatos tabulares: .csv
, .xlsx
, .sav
, .dta
, etc ...
no tabulares: .json
, .xml
, etc ...
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é?
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
.
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, haven y readxl.
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, haven y readxl.
A pesar de ello, vamos a usar un paquete que, sin que lo veamos, llama/utiliza indirectamente esos paquetes y otros, y que permite importar y exportar ficheros en casi cualquier formato.
Utilizaremos el paquete rio
. En su web pone que el paquete rio es "A Swiss-Army Knife for Data I/O".
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, haven y readxl.
A pesar de ello, vamos a usar un paquete que, sin que lo veamos, llama/utiliza indirectamente esos paquetes y otros, y que permite importar y exportar ficheros en casi cualquier formato.
Utilizaremos el paquete rio
. En su web pone que 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
???
un paquete de R
en Internet
en nuestro ordenador
#- 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 irisfind("my_iris") #- ¿donde está my_iris?iris <- iris #- ???find("iris") #- ¿donde está ahora iris?
Resulta que quiero usar unos 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í.
Bueno, la tarea está clara: carga en memoria los datos de los pingüinos, el fichero penguins
.
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.
penguins
#- en el pkg palmerpenguins hay 2 conjuntos de datoslibrary(palmerpenguins) #- install.packages("palmerpenguins")#- ya podemos usar los datos de penguins xq hemos cargado (attach) el paquete en memoria de Rpenguinsmy_penguins <- penguins#- quiero tb hablaros de la siguiente expresión #- es importante acostumbrarse a ella [ 🌟 ]palmerpenguins::penguins
rio
rio
solo tiene dos funciones: import()
y export()
. ¿Adivinas que hace cada una de ellas?rio
rio
solo tiene 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 es: "A character string naming a file, URL, or single-file .zip or .tar archive". WTF!!
rio
rio
solo tiene 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 es: "A character string naming a file, URL, or single-file .zip or .tar archive". WTF!!
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
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?
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.frameiris_2 <- rio::import(la_direccion, setclass = "tibble") #- como tibbleiris_3 <- tibble::as_tibble(iris_1) #- convertimos df_1 a tibble
rio
"x"
y "file"
rio
"x"
y "file"
01:00
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.
Por favor, utiliza la función rio::export()
para exportar a un fichero (de tu ordenador) el conjunto de datos iris
en formato .csv
.
rm(list = ls()) #- [🌶] antes vamos a limpiar el Global env.my_iris <- irisrio::export(my_iris, "my_iris.csv") #- sin los nombres de los argumentosrio::export(x = my_iris, file = "my_iris.csv") #- CON los nombres de los argumentos#- IMPORTANTE: ¿Donde hemos guardado my_iris? [ 🌟 ]
¿Donde hemos guardado antes el fichero "my_iris.csv"? En el "directorio de trabajo"
Puedes guardar ahora 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)
fs::dir_create("pruebas") #- [🌶] creo el subdirectoriorio::export(my_iris, "./pruebas/my_iris.csv")
la_ruta <- here::here("pruebas", "my_iris.csv")rio::export(my_iris, la_ruta)rio::export(my_iris, here::here("pruebas", "my_iris.csv"))
rio
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
.
rio::export(iris, here::here("pruebas", "iris.csv"))rio::export(iris, here::here("pruebas", "iris.xlsx"))rio::export(iris, here::here("pruebas", "iris.sav"))
Por favor, utiliza la función rio::export()
para exportar el conjunto de 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
.
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"))
rio
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"
rm(list = ls())iris_1 <- rio::import(here::here("pruebas", "iris.csv"))iris_2 <- rio::import(here::here("pruebas", "iris.xlsx"))
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"
Esta vez ya no hay solución!!! Tienes que acostumbrarte a escribir en R.
Ya te manejas leyendo, PERO hay que empezar a escribir!!
Es importante que diferenciéis entre descargarse un fichero y cargar el fichero en R, cargar el fichero en memoria de R
download.file()
descargamos el fichero y lo guardamos en un fichero en nuestro ordenador#- en esta url hay un fichero de datos en formato .csvmy_url <- "https://raw.githubusercontent.com/perezp44/iris_data/master/data/iris.csv"download.file(url = my_url, destfile = here::here("pruebas", "iris_descargado.csv"))
rio::import()
NO guardamos el fichero, sino que lo cargamos en memoria de R, en el Global Env.aa <- rio::import(my_url)
.xlsx
ya existente.#- bonus: le añadimos un libro mas al archivo "./pruebas/iris.xlsx"rio::export(x = iris, file = here::here("pruebas", "iris.xlsx"), which = "iris_2")
.xlsx
ya existente.#- bonus: le añadimos un libro mas al archivo "./pruebas/iris.xlsx"rio::export(x = iris, file = here::here("pruebas", "iris.xlsx"), which = "iris_2")
.xlsx
rio::export(x = list(iris = iris, pinguinos = palmerpenguins::penguins), file = here::here("pruebas", "my_iris_pinguinos.xlsx"))
.xlsx
iris_1 <- rio::import(here::here("pruebas", "my_iris_pinguinos.xlsx")) #- solo importa el primer libropinguinos_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")
.xlsx
library(readxl)my_dfs_list <- lapply(excel_sheets(here::here("pruebas", "my_iris_pinguinos.xlsx")), read_excel, path = here::here("pruebas", "my_iris_pinguinos.xlsx"))
.xlsx
library(readxl)my_dfs_list <- lapply(excel_sheets(here::here("pruebas", "my_iris_pinguinos.xlsx")), read_excel, path = here::here("pruebas", "my_iris_pinguinos.xlsx"))
"pruebas"
#- 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)
"./pruebas/"
#- 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 fsfs::dir_delete("pruebas")
Formatos de datos propios de R
Formatos de datos propios de R
Obtener datos a través de API's
Formatos de datos propios de R
Obtener datos a través de API's
Webscrapping
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.
si quieres grabar un solo objeto, es preferible hacerlo como .Rds
si quieres grabar varios objetos tienes que hacerlo como RData
o abreviado como .Rda
El formato .RData
tienen 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.
.Rda
save(mtcars, iris, file = here::here("pruebas", "mtcars_and_iris.RData")
.Rda
: tienes que usar la función load()
load(here::here("pruebas", "mtcars_and_iris.RData"))
.rds
saveRDS(iris, here::here("pruebas", "iris_1.rds")) #- con base-Rreadr::write_rds(iris, here::here("pruebas", "iris_2.rds")) #- con pkg "readr"rio::export(iris, here::here("pruebas", "iris_3.rds"))
.rds
my_iris_1 <- readRDS(here::here("pruebas", "iris_3.rds")) #- con R-basemy_iris_1 <-readr::read_rds(here::here("pruebas", "iris_3.rds")) #- tidyversemy_iris_2 <- rio::import(here::here("pruebas", "iris_3.rds"))
# 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"
# install.packages("eurostat")library(eurostat)#- podemos buscar un "tema" con la f. search_eurostat()aa <- search_eurostat("employment", type = "all") #- elegimos una tabla de Eurostatmy_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 tabladf_l <- label_eurostat(df) #- pone labels: mas legible, menos fácil de programar
quantmod
Permite acceder a una gran variedad de datos económicos. Aquí está su web.
library(quantmod) #- install.packages("quantmod")#- For stocks and shares, the yahoo source is used. facebook <- getSymbols(Symbols = 'FB', src = 'yahoo', auto.assign = FALSE) #- For currencies and metals, the oanda source is used. Stc_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)
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 tablaTeruel <- body_table[[1]] #- estoy haciendo subsetting de una lista
names(Teruel) <- c("Nombre", "Extension", "Poblacion", "Densidad", "Comarca", "Partido_judicial", "Altitud")library(stringr)Teruel <- Teruel %>% map(str_trim) %>% as_tibble() #- quita caracteres al finalTeruel <- Teruel %>% mutate(Altitud = str_replace_all(Altitud,"[[:punct:]]", "")) Teruel <- Teruel %>% mutate(Altitud = as.double(Altitud)) %>% arrange(desc(Altitud))
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 10 tablas, seleccionamos 2 tabla_6 <- body_table[[6]] tabla_7 <- body_table[[7]]
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"
rio
rm(list = ls()) #- antes vamos a limpiar el Global env.my_url <- "https://www.ine.es/daco/daco42/codmun/codmun20/20codmun.xlsx"download.file(my_url, here::here("pruebas", "ine_rel_muni.xlsx")) #- lo guardo en discodf_1 <- rio::import(my_url)
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
....
df_2 <- readxl::read_xlsx(my_url, skip = 1) #- no funciona. solo lee del PCdf_2 <- readxl::read_xlsx(here::here("pruebas", "ine_rel_muni.xlsx"), skip = 1)
#- 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"fs::dir_create("tmp") #- creo un directorio temporalmy_ruta <- here::here("tmp", nombre_fichero) #- ruta para guardar el ficherocurl::curl_download(url = url_descarga, destfile = my_ruta)
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`
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)
readr::write_csv(df, file = here::here("tmp", "my_relacion_muni_2021.csv"))
df_muni <- df %>% group_by(ine_prov) %>% summarise(numero_muni = n())df_muni <- df %>% count(ine_prov)
codigos_prov <- pjpv.datos.01::pob_prov_1996_2020 %>% filter(year == 2020)str(codigos_prov)
#- fusiono los 2 ficheros (lo veremos!!)df_ok <- left_join(df_muni, codigos_prov)
tmp
para dejar el Rproject limpiofs::dir_delete("tmp") #- [🌶] borro el directorio temporal
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í
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"
as.data.frame()
. Puedes leerlo aquícurl::curl_download( url = "https://direccion-al-archivo.gpx", destfile = "./datos/pruebas/my_archivo.gpx")
#- 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 funcionadf <- repmis::source_data(my_url)
my_data <- rio::import(file.choose())
El capítulo de importación e datos de R4DS.
Un buen capítulo sobre importación de datos en R.
Muy buen tutorial
Unas buenas transparencias de Earo Wang. Aquí están sus datos.