Programación y manejo de datos con R
(Web del curso aquí)
Antes de empezar: paquetes que usaremos en este tema
¿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
¿Y cómo se descargan datos con R?
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()
my_url <- "https://raw.githubusercontent.com/perezp44/archivos_download/refs/heads/master/plazas_turisticas.csv"
my_ruta <- "./pruebas/plazas_turisticas.csv"
1curl::curl_download(url = my_url, destfile = my_ruta)
2info <- c(paste("Fichero:", my_ruta),
paste("Descargado de:", my_url),
paste("Fecha de descarga:", Sys.Date()))
3writeLines(info, con = paste0(my_ruta, "_lee.txt"))
4writeLines(info, con = paste0(fs::path_ext_remove(my_ruta), "_lee.txt"))paste() “pega” trozos de texto y Sys.Date() devuelve la fecha de hoy
writeLines() guarda el vector en un fichero de texto. Así se llamaría plazas_turisticas.csv_lee.txt: un nombre con 2 extensiones puede dar problemas
fs::path_ext_remove() le quita la extensión (.csv) a la ruta, y el fichero se llama plazas_turisticas_lee.txt
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?
rm(iris) #- borramos nuestro iris del Global (si no, ¡taparía al iris "de verdad"!)
find("iris") #- volvemos a tener solo el iris de R-baseTarea: usar unos datos de un paquete
flows que está en el paquete refugeesrefugees es un paquete que no está en R-baseinstall.packages("refugees") o mejor con pak::pak("refugees")library(refugees)flows1my_flows_2 <- refugees::flowsflows 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)
por supuesto hay muchos otros formatos de datos
.json, .parquet, .rds etc etc … Tienes una lista amplia de formatos en la web del paquete rioPara 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)
cuidado con los .csv “españoles”
.csv de organismos españoles (INE, CCAA, ayuntamientos …) no siguen el formato “internacional”:| CSV | CSV “a la española” | |
|---|---|---|
| separador de columnas | , |
; |
| separador decimal | . |
, |
| codificación (tildes, ñ) | UTF-8 |
a veces Latin-1 |
df <- rio::import("./datos/datos_csv_a_la_espanola.csv",
1 sep = ";",
2 dec = ",",
3 encoding = "Latin-1")
4df <- readr::read_csv2("./datos/datos_csv_a_la_espanola.csv",
locale = readr::locale(encoding = "Latin1"))import() que las columnas están separadas por ;
,
readr::read_csv2() ya está preparada para el formato “español”: espera ; para separar las columnas y , para los decimales. La codificación se le indica con locale (solo si hay problemas con tildes, eñes …)
¿y esos caracteres raros? R y el fichero no se entienden [🌶🌶]
UTF-8. Los problemas llegan cuando la codificación del fichero y la que usa R no coinciden. Hay 2 casos:(1) El fichero está en Latin-1 y no se lo digo a R
R no entiende la è de València y RStudio ni siquiera puede enseñarte el data.frame
Solución: decirle la codificación con encoding = "Latin-1"
(2) El fichero está en UTF-8 y le digo a R que es Latin-1
Ahora sí se ve el data.frame, pero con los famosos “caracteres raros”
Solución: quitar encoding (el fichero ya está en el formato que R espera)
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? pulsa Av. Pág para ver la respuestaLa 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
here::here() para ver qué os sale.rda y .rdsFormatos 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
iris la variable Species es un factor (un metadato). Veamos qué pasa al exportar e importar:Formato .rds
.rdsFormato .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()load() no se asigna a ningún objeto (df <- load(...) solo guarda los nombres de los objetos) y además sobrescribe sin avisar los objetos del Global que se llamen igual. Por eso, para un único data.frame, es mejor .rds.rda desde la web, lo más seguro es descargarlo primero y después usar load()my_url <- "https://github.com/perezp44/LAU2boundaries4spain/blob/master/data/Provincias.rda?raw=true"
my_ruta <- "./pruebas/Provincias.rda"
curl::curl_download(url = my_url, destfile = my_ruta) #- 1) lo descargamos
load(my_ruta) #- 2) lo cargamos: aparece en el Global
#- load(url(my_url)) a veces falla (si el archivo está comprimido)Extensión: un formato moderno, Parquet [🌶🌶]
Parquet es un formato cada vez más usado en ciencia de datos:
.rds) ….rds, se puede leer desde otros lenguajes (Python, SQL …)Extensión: el formato JSON [🌶🌶]
JSON es un formato de texto muy usado en internet: es el formato en el que suelen responder las API’s
"nombre": valorUTF-8: adiós a los “caracteres raros”.csv no puede hacerHay 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
Aprenderemos a descargar y manejar datos con el paquete eurostat
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) eurostat usando ejemplosINE: datos de España con el paquete ineapir
El INE ofrece sus datos a través de una API, que devuelve los datos en formato JSON
El propio INE ha creado un paquete de R para usarla: ineapir. Aquí tienes su cheatsheet
24077 (lo ves en la url: t=24077)# install.packages("ineapir")
#- importamos los últimos 12 periodos de la tabla 24077 (IPC)
df <- ineapir::get_data_table(idTable = 24077, nlast = 12, unnest = TRUE)
#- ¿y qué tabla es la 24077? La buscamos en el listado de tablas del IPC
tablas_ipc <- ineapir::get_metadata_tables_operation(operation = "IPC")
tablas_ipc %>% filter(Id == 24077) %>% select(Id, Nombre)
#- [🌶] ¿qué operaciones estadísticas tiene el INE?
operaciones <- ineapir::get_metadata_operations()ineapir y a manoEl paquete quantmod
library(quantmod) #- install.packages("quantmod")
#- series económicas: fuente FRED (Reserva Federal de St. Louis)
#- tipo de cambio dólares por euro
tc_euro_dolar <- getSymbols(Symbols = 'DEXUSEU', src = 'FRED', auto.assign = FALSE)
#- PIB de Japón
Japan_GDP <- getSymbols(Symbols = 'JPNNGDP', src = 'FRED', auto.assign = FALSE)hay paquetes de R para (casi) todas las fuentes de datos oficiales
ineapir y eurostat, hay muchos más paquetes que descargan los datos de un organismo y nos los devuelven como data.frame’s:| Datos de … | Organismo | Paquete | Función principal |
|---|---|---|---|
| España | INE | ineapir |
get_data_table() |
| España: tipos de interés, euríbor … | Banco de España | tidyBdE |
bde_series_load() |
| España: resultados electorales | Ministerio del Interior | infoelectoral |
provincias(), municipios() |
| Unión Europea | Eurostat | eurostat |
get_eurostat() |
| Zona euro: tipos de interés, tipos de cambio … | Banco Central Europeo | ecb |
get_data() |
| Mundo: indicadores por países | Banco Mundial | WDI, wbstats |
WDI(), wb_data() |
| Mundo: previsiones económicas | FMI | imfweo |
weo_get() |
| EE.UU. y series internacionales | FRED (Reserva Federal) | fredr, tidyquant |
fredr(), tq_get() |
| De todo un poco | DBnomics | rdbnomics |
rdb() |
Casi todos funcionan igual: buscas el código de la tabla o de la serie que te interesa y se lo pasas a la función principal
Casi ninguno pide registrarse; fredr sí necesita una clave (gratuita)
¿recordaís que hay que hacer un trabajo en grupo y otro individual?
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()penguins está en R-base desde la versión 4.5 de R. Si tienes una versión anterior, usa palmerpenguins::penguinsBonus 3 (🌶🌶): importar una hoja/libro específica de un archivo .xlsx
rio, pero …sheetBonus 4: (!!!! 😱 😱) importamos todos los libros de un archivo .xlsx
rio, pero ahora con la función rio::import_list()library(readxl) #- necesitamos la función readxl::excel_sheets()
my_sheets <- readxl::excel_sheets(here::here("pruebas", "my_iris_pinguinos.xlsx"))
#- con base::lapply()
my_dfs_list <- lapply(my_sheets,
readxl::read_excel,
path = here::here("pruebas", "my_iris_pinguinos.xlsx"))
#- con purrr::map()
my_dfs_list <- purrr::map(my_sheets,
readxl::read_excel,
path = here::here("pruebas", "my_iris_pinguinos.xlsx"))Bonus 5: (!!!!!!) importamos todos archivos de datos de una carpeta concreta
#- importamos todos los archivos .csv que hay en "./pruebas/"
my_carpeta <- here::here("pruebas")
1lista_de_archivos <- fs::dir_ls(my_carpeta, glob = "*.csv")
2my_dfs_list_2 <- rio::import_list(lista_de_archivos)
3my_dfs_list_3 <- purrr::map(lista_de_archivos, rio::import).csv de la carpeta. Filtramos por tipo porque en pruebas también hay .xlsx con varias hojas, .RData con varios objetos, etc.
rio::import_list() importa todos los ficheros y los guarda en una lista
purrr::map()
Web scraping [🌶🌶🌶 🌶🌶]
Web scraping (ejemplo)
rvestlibrary(rvest) #- html_elements() es el nuevo nombre de html_nodes()
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_elements('body') %>%
html_elements('table') %>%
html_table(dec = ",")
#- la tabla que queremos es la primera
Teruel <- body_table[[1]] #- estoy haciendo subsetting de una listaWeb scraping (ejemplo): arreglamos la tabla [🌶🌶🌶 🌶🌶]
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))Web scraping (otro ejemplo): cuando los datos no están en una tabla [🌶🌶🌶 🌶🌶]
En el ejemplo anterior los datos estaban en una tabla (<table>) y bastaba con html_table(). Lo normal es que no sea así
Esta web es una librería “de mentira”, hecha para practicar: cada libro es una “caja” con su título, su precio …
Hay que decirle a R dónde está cada dato, usando selectores CSS (se ven con el botón derecho > “Inspeccionar”)
library(rvest)
library(tidyverse)
my_url <- "https://books.toscrape.com/"
content <- read_html(my_url)
1libros <- content %>% html_elements(".product_pod")
df <- tibble(
2 titulo = libros %>% html_element("h3 a") %>% html_attr("title"),
3 precio = libros %>% html_element(".price_color") %>% html_text2(),
4 estrellas = libros %>% html_element(".star-rating") %>% html_attr("class"))
5df <- df %>% mutate(precio = parse_number(precio),
estrellas = str_remove(estrellas, "star-rating "))product_pod: obtenemos las 20 cajas de la página
title del enlace (a) que hay dentro del h3
price_color: sale como texto (“£51.77”)
digresión: es lo mismo un data.frame que una tibble [🌶🌶🌶]
Sí y no (!!!)
as.data.frame(). Puedes leerlo aquíOK, pero entonces … ¿en qué se diferencian un data.frame y una tibble? [🌶🌶🌶]
Acabamos de ver que por dentro son lo mismo: las dos son una lista de columnas (por eso typeof() devuelve "list")
Lo único que cambia es la clase: una tibble es un data.frame al que se le añaden 2 clases (tbl_df y tbl). Como "data.frame" sigue ahí, (casi) todo lo que funciona con un data.frame, funciona con una tibble
[ ], la tibble sigue siendo una tibble (el data.frame se convierte en un vector !!)iris y luego iris_2as.data.frame()seleccionando “manualmente” un archivo de datos 😱
El script no “sabe” qué fichero elegiste. En unos días tú tampoco te acordarás. Si le das el script a otra persona no podrá repetir tu análisis
Además, el script ya no puede ejecutarse solo: se queda esperando a que alguien haga clic
Bueno … sí tiene un uso: averiguar la ruta de un fichero. Ejecuta file.choose() en la consola, elige el fichero, y te devuelve su ruta
Pero OJO: te devuelve una ruta absoluta (C:/Users/tu-usuario/...), que solo funciona en tu ordenador. En el script hay que escribirla como ruta relativa ("./pruebas/iris.csv") o, mejor aún, con here::here(). Lo vemos ahora
gestionando las rutas con here::here()
Problemas con las rutas “tradicionales”
C:/Users/my_usuario/my_proyecto/datos/archivo.csv"./datos/archivo.csv"getwd()).qmd
.qmd, el directorio de trabajo pasa a ser la carpeta donde está el .qmd (no la del proyecto)Rutas con here::here()
here::here() busca la carpeta raíz de tu proyecto (donde está el fichero .Rproj) y construye la ruta desde ahí.R y en ficheros .qmdsetwd() al inicio!! Tu yo futuro y tus coautores te lo agradecerán!! ✨un ejemplo: ¿qué pasa si mi .qmd está en una subcarpeta del proyecto?
my_proyecto/ 👈 carpeta raíz
├── my_proyecto.Rproj
├── datos/
│ └── iris.csv 👈 quiero importarlo
├── scripts/
│ └── analisis.R
└── informes/
└── informe.qmdiris.csv desde analisis.R y desde informe.qmdanalisis.R: el directorio de trabajo es la carpeta raíz del proyectomy_proyecto/datos/iris.csvinforme.qmd: al compilar, el directorio de trabajo es la carpeta del .qmdmy_proyecto/informes/datos/iris.csv … y ahí no hay nada!!.qmd también funcionaría "../datos/iris.csv" (.. es “sube una carpeta”), pero es frágil: si mueves el .qmd de sitio, deja de funcionar¿cómo construir nuestras rutas con here::here()?
iris, hacíamos algo como:here::here() haremos:here::here() nos devuelve una ruta absoluta, pero diferente para cada ordenador:en mi ordenador (Linux): /home/pedro/my_proyecto/pruebas/iris.xlsx
en el de Andrés (Windows): C:/Users/andres/my_proyecto/pruebas/iris.xlsx
en el de Ana (Mac): /Users/ana/my_proyecto/pruebas/iris.xlsxPara leer más sobre here: ¿por qué usar here? y cómo organizar un proyecto de R
Sobre gestión de rutas en R: el paquete fs (Albert Rapp), el paquete fs (Danielle Navarro) y paths seguros
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
un caso más complejo
Queremos saber qué provincia tiene más municipios. Para contar el nº de municipios por provincia tenemos que descargar el fichero con la relación de municipios del INE. El fichero (a 1 de enero de 2026) está aquí: https://www.ine.es/daco/daco42/codmun/diccionario26.xlsx
Vamos a importarlo 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/diccionario26.xlsx"
my_ruta_guardar <- here::here("pruebas", "diccionario26.xlsx")
curl::curl_download(my_url, my_ruta_guardar) #- lo guardo en disco
1df_1 <- rio::import(my_ruta_guardar)
2df_1 <- rio::import(my_ruta_guardar, skip = 1)df_1: la primera fila del Excel es un título, y R la ha usado como nombres de las columnas
skip = 1 le decimos que se salte esa primera fila
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 2026
my_url <- "https://www.ine.es/daco/daco42/codmun/diccionario26.xlsx"
1my_ruta <- here::here("pruebas", basename(my_url))
2curl::curl_download(url = my_url, destfile = my_ruta)
3info <- c(paste("Fichero:", basename(my_ruta)),
paste("Descargado de:", my_url),
paste("Fecha de descarga:", Sys.Date()))
writeLines(info, con = paste0(fs::path_ext_remove(my_ruta), "_lee.txt"))
4df <- readxl::read_xlsx(path = my_ruta, skip = 1)basename() se queda con el nombre del fichero (diccionario26.xlsx): así no hay que escribirlo a mano
pruebas
skip = 1 también hubiese funcionado con rio, ya que rio llama a readxl)
seguimos con el ejemplo
aparecen muchas cosas/funciones que veremos más adelante [🌶🌶🌶🌶]
library(tidyverse)
df <- df %>%
1 mutate(ine_muni = paste0(CPRO, CMUN)) %>%
2 mutate(year = 2026L) %>%
3 rename(ine_muni.n = NOMBRE) %>%
rename(ine_prov = CPRO) %>%
4 select(ine_muni, ine_muni.n, ine_prov, year)
str(df)CPRO) seguido del suyo (CMUN): los “pegamos” con paste0()
L es para que sea un nº entero)
nombre_nuevo = nombre_antiguo
count() cuenta cuántas filas (municipios) hay de cada provincia: el resultado se guarda en una columna llamada n
df_muni solo tenemos el código de cada provincia. Los nombres los tiene el INE en esta página. ¡Hacemos web scraping!library(rvest)
my_url_prov <- "https://www.ine.es/daco/daco42/codmun/cod_provincia.htm"
1tablas <- read_html(my_url_prov, encoding = "latin1") %>%
html_elements("table") %>%
html_table()
2codigos_prov <- bind_rows(tablas[2:4]) %>%
3 mutate(ine_prov = sprintf("%02d", Código)) %>%
rename(ine_prov.n = Literal) %>%
select(ine_prov, ine_prov.n)UTF-8 sino en Latin-1: hay que decírselo (¿te suena?)
bind_rows()
1) y en nuestros datos es un texto ("01"): sprintf() lo convierte
ine_prov n ine_prov.n
1 09 371 Burgos
2 37 362 Salamanca
3 08 311 Barcelona
4 50 293 Zaragoza
5 19 288 Guadalajarapruebas (para dejar el Rproject limpio)algunas referencias
El capítulo de importación de datos de R4DS (2ª ed.).
Un buen capítulo sobre importación de datos en R.
Unas buenas transparencias de Earo Wang. Aquí están sus datos.