Capítulo 17 Sacando datos de las piedras

Hemos aprendido a crear nuestros propios datos pero muchas veces los cargaremos de distintos archivos y fuentes. Vamos a ver algunas formas que tenemos para importar (cargar) datos con casos prácticos.

Es recomendable tener los datos en la misma carpeta del proyecto pero una carpeta separada, ya que podemos tener muchos archivos y así no mezclamos dichos ficheros con los códigos que escirbamos. En la carpeta DATOS tienes los distintos conjuntos que utilizaremos. Debes descargarte el .zip del repositorio, y una vez descargada, mover la carpeta DATOS a la carpeta de tu proyecto.

17.1 Pasajeros del RMS Titanic (archivo .RData)

Fuente original de los datos: https://www.kaggle.com/c/titanic/overview

El 15 de abril de 1912 se producía el hundimiento naval más famoso de la historia: el hundimiento del barco RMS Titanic. Tras chocar con un iceberg, y con un déficit de botes salvavidas a bordo, murieron 1502 de los 2224 pasajeros (tripulación incluida) que iban a bordo del navío.

¿Qué edad, sexo o cabina ocupabana los pasajeros que sobrevivieron y los que no sobrevivieron? Dicho conjunto de datos nos va a servir para ilustrar la forma más sencilla de guardar datos y variables en R, y que además ocupa menos espacio en nuestro disco duro: los archivos propios que tiene R con extensiones .rda o .RData. De nuestra carpeta DATOS cargaremos el archivo titanic.RData, un archivo con extensión .RData, conteniendo los datos de los pasajeros del Titanic (nombre, título, cabina, si sobrevivió o no, edad, etc)

¿Cómo cargar archivos .RData?

Muy sencillo: como son ficheros nativos de R, basta con usar la función de carga load(), y dentro de los paréntesis la ruta del archivo que queramos cargar.

load("./DATOS/titanic.RData")

Fíjate que, al fijar nuestro directorio de trabajo, no necesitamos toda la ruta, solo ./ (que nos arranca la ruta en la carpeta de nuestro proyecto) más la ruta dentro de la carpeta del proyecto. Ahora en el panel de entorno de la parte superior derecha tendremos un data.frame que antes no teníamos. Ya hemos visto que una función muy útil es head(), con argumento el nombre de un data.frame, que nos permite visualizar las primeras filas.

head(titanic)
##   PassengerId Survived Pclass
## 1           1        0      3
## 2           2        1      1
## 3           3        1      3
## 4           4        1      1
## 5           5        0      3
## 6           6        0      3
##                                                  Name    Sex Age SibSp Parch
## 1                             Braund, Mr. Owen Harris   male  22     1     0
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female  38     1     0
## 3                              Heikkinen, Miss. Laina female  26     0     0
## 4        Futrelle, Mrs. Jacques Heath (Lily May Peel) female  35     1     0
## 5                            Allen, Mr. William Henry   male  35     0     0
## 6                                    Moran, Mr. James   male  NA     0     0
##             Ticket    Fare Cabin Embarked
## 1        A/5 21171  7.2500              S
## 2         PC 17599 71.2833   C85        C
## 3 STON/O2. 3101282  7.9250              S
## 4           113803 53.1000  C123        S
## 5           373450  8.0500              S
## 6           330877  8.4583              Q

Dicho fichero hemos visto que podemos convertirlo a un formato más óptimo con as_tibble()

library(tibble)
titanic <- as_tibble(titanic)
titanic
## # A tibble: 891 × 12
##    PassengerId Survived Pclass Name   Sex     Age SibSp Parch Ticket  Fare Cabin
##          <int>    <int>  <int> <fct>  <fct> <dbl> <int> <int> <fct>  <dbl> <fct>
##  1           1        0      3 Braun… male     22     1     0 A/5 2…  7.25 ""   
##  2           2        1      1 Cumin… fema…    38     1     0 PC 17… 71.3  "C85"
##  3           3        1      3 Heikk… fema…    26     0     0 STON/…  7.92 ""   
##  4           4        1      1 Futre… fema…    35     1     0 113803 53.1  "C12…
##  5           5        0      3 Allen… male     35     0     0 373450  8.05 ""   
##  6           6        0      3 Moran… male     NA     0     0 330877  8.46 ""   
##  7           7        0      1 McCar… male     54     0     0 17463  51.9  "E46"
##  8           8        0      3 Palss… male      2     3     1 349909 21.1  ""   
##  9           9        1      3 Johns… fema…    27     0     2 347742 11.1  ""   
## 10          10        1      2 Nasse… fema…    14     1     0 237736 30.1  ""   
## # … with 881 more rows, and 1 more variable: Embarked <fct>

Y con glimpse() podemos echar un vistazo a las variables del fichero (una fila por pasajero).

glimpse(titanic)
## Rows: 891
## Columns: 12
## $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
## $ Survived    <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1…
## $ Pclass      <int> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3…
## $ Name        <fct> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl…
## $ Sex         <fct> male, female, female, female, male, male, male, male, fema…
## $ Age         <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39, 14, …
## $ SibSp       <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0…
## $ Parch       <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0…
## $ Ticket      <fct> A/5 21171, PC 17599, STON/O2. 3101282, 113803, 373450, 330…
## $ Fare        <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,…
## $ Cabin       <fct> , C85, , C123, , , E46, , , , G6, C103, , , , , , , , , , …
## $ Embarked    <fct> S, C, S, S, S, Q, S, S, S, C, S, S, S, S, S, S, Q, S, S, C…

17.2 Datos covid del ISCIII (archivo .csv)

Fuente original de los datos: https://cnecovid.isciii.es/covid19/resources/casos_tecnica_ccaa.csv

Otra opción habitual son los archivos .csv (comma separated values): son archivos cuyos valores están separados por comas (u otro caracter, como puntos, puntos y comas, o tabuladores). En apariencia cuando los abrimos en el ordenador son como un Excel (ya que los abre el Excel), pero ocupan mucho menos que un Excel y su lectura es universal (independiente de tener instalado o no el Excel) ya que son archivos de texto sin formato.

Para leer un archivo .csv tenemos dos opciones. La primera es usar la función read.csv() que ya viene de base con R, y asignarle al argumento file la ruta del archivo (tiene otros argumentos extras por si queremos especifiar el caracter que separa las columnas, si incluímos o no una cabecera de la tabla, y otros argumentos que puedes consultar con ? read.csv). Para mostrar un ejemplo vamos a realizar la carga del mismo fichero del Titanic pero ahora a través del archivo titanic.csv que tenemos en nuestra carpeta DATOS.

titanic <- read.csv(file = "./DATOS/titanic.csv")
head(titanic)
##   PassengerId Survived Pclass
## 1           1        0      3
## 2           2        1      1
## 3           3        1      3
## 4           4        1      1
## 5           5        0      3
## 6           6        0      3
##                                                  Name    Sex Age SibSp Parch
## 1                             Braund, Mr. Owen Harris   male  22     1     0
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female  38     1     0
## 3                              Heikkinen, Miss. Laina female  26     0     0
## 4        Futrelle, Mrs. Jacques Heath (Lily May Peel) female  35     1     0
## 5                            Allen, Mr. William Henry   male  35     0     0
## 6                                    Moran, Mr. James   male  NA     0     0
##             Ticket    Fare Cabin Embarked
## 1        A/5 21171  7.2500              S
## 2         PC 17599 71.2833   C85        C
## 3 STON/O2. 3101282  7.9250              S
## 4           113803 53.1000  C123        S
## 5           373450  8.0500              S
## 6           330877  8.4583              Q

Una diferencia con los .RData es que estos no necesitan que le asignemos el valor a una variable (dentro de un .RData tenemos ya guardada la variable). Fíjate que es el mismo archivo que antes, y que nos lo ha guardado en formato data.frame.

¿Cómo podríamos cargar un .csv pero ya guardado en tibble? Para ello usaremos la función read_csv() del paquete readr.

library(readr)
titanic <- read_csv(file = "./DATOS/titanic.csv")
titanic
## # A tibble: 891 × 12
##    PassengerId Survived Pclass Name   Sex     Age SibSp Parch Ticket  Fare Cabin
##          <dbl>    <dbl>  <dbl> <chr>  <chr> <dbl> <dbl> <dbl> <chr>  <dbl> <chr>
##  1           1        0      3 Braun… male     22     1     0 A/5 2…  7.25 <NA> 
##  2           2        1      1 Cumin… fema…    38     1     0 PC 17… 71.3  C85  
##  3           3        1      3 Heikk… fema…    26     0     0 STON/…  7.92 <NA> 
##  4           4        1      1 Futre… fema…    35     1     0 113803 53.1  C123 
##  5           5        0      3 Allen… male     35     0     0 373450  8.05 <NA> 
##  6           6        0      3 Moran… male     NA     0     0 330877  8.46 <NA> 
##  7           7        0      1 McCar… male     54     0     0 17463  51.9  E46  
##  8           8        0      3 Palss… male      2     3     1 349909 21.1  <NA> 
##  9           9        1      3 Johns… fema…    27     0     2 347742 11.1  <NA> 
## 10          10        1      2 Nasse… fema…    14     1     0 237736 30.1  <NA> 
## # … with 881 more rows, and 1 more variable: Embarked <chr>

 

Una de las ventajas de la carga de archivos en R es que muchos formatos podemos cargarlos sin ni siquiera tener el archivo en nuestro ordenador, a través de un enlace web. Vamos a ver un ejemplo con los datos del ISCIII sobre la pandemia. En su web https://cnecovid.isciii.es/covid19/#documentaci%C3%B3n-y-datos tienen varios archivos colgados, que podemos o bien descargarlos, o haciendo click derecho «Copiar dirección de enlace» obtenemos un enlace. Por ejemplo, para el archivo casos_tecnica_ccaa.csv, que nos almacena el número de casos por técnica diagnóstica y CCAA, tenemos el enlace https://cnecovid.isciii.es/covid19/resources/casos_tecnica_ccaa.csv. Dicho enlace es el que se abre cuando pulsamos en Descargar, pero podemos introducirlo directamente en R, sustituyendo a nuestra ruta en read_csv(), y teniéndolo ya almacenado en formato tibble.

datos_ISCIII <- read_csv(file = "https://cnecovid.isciii.es/covid19/resources/casos_tecnica_ccaa.csv")
datos_ISCIII
## # A tibble: 14,402 × 8
##    ccaa_iso fecha      num_casos num_casos_prueba_pcr num_casos_prueba_test_ac
##    <chr>    <date>         <dbl>                <dbl>                    <dbl>
##  1 AN       2020-01-01         0                    0                        0
##  2 AR       2020-01-01         0                    0                        0
##  3 AS       2020-01-01         0                    0                        0
##  4 CB       2020-01-01         0                    0                        0
##  5 CE       2020-01-01         0                    0                        0
##  6 CL       2020-01-01         0                    0                        0
##  7 CM       2020-01-01         0                    0                        0
##  8 CN       2020-01-01         0                    0                        0
##  9 CT       2020-01-01         0                    0                        0
## 10 EX       2020-01-01         0                    0                        0
## # … with 14,392 more rows, and 3 more variables: num_casos_prueba_ag <dbl>,
## #   num_casos_prueba_elisa <dbl>, num_casos_prueba_desconocida <dbl>
dim(datos_ISCIII)
## [1] 14402     8
glimpse(datos_ISCIII)
## Rows: 14,402
## Columns: 8
## $ ccaa_iso                     <chr> "AN", "AR", "AS", "CB", "CE", "CL", "CM",…
## $ fecha                        <date> 2020-01-01, 2020-01-01, 2020-01-01, 2020…
## $ num_casos                    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,…
## $ num_casos_prueba_pcr         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,…
## $ num_casos_prueba_test_ac     <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ num_casos_prueba_ag          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ num_casos_prueba_elisa       <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ num_casos_prueba_desconocida <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…

Como puedes ver con glimpse(datos_ISCIII), el archivo tiene 8 columnas: un código identificador de las CCAA, la fecha, y 6 variables relativas a casos detectados (en función de la técnica con la que se ha detectado). Y además tiene un número de filas igual a las 19 CCAA (17 + Ceuta + Melilla) por el número de días en los que hay registros.

¿Cuál es la ventaja de cargarlo así? Ese enlace es fijo, y tendrá siempre el último archivo que hayan actualizado, sin preocuparnos de tener que bajarnos cada día el archivo: simplemente ejecutamos dicha carga, y tenemos asegurado que nos bajaremos el archivo lo más actualizado posible, de manera automática.

17.3 Discursos de los jefes de Estado (archivo .txt)

Fuente original de los datos: https://github.com/lirondos/discursos-de-navidad/tree/master/data/speeches

Una de las herramientas más útiles a la hora de aprender de la comunidad es la plataforma Github, un repositorio donde podemos subir códigos en abierto, proponer cambios para subsanar errores de trabajos ajenos, que otros subsanen los nuestros, y una base de datos bastante extensa de paquetes y conjuntos de datos. El código de este mismo manual lo puedes consultar en https://github.com/dadosdelaplace/courses-ECI-2022

De dicha plataforma vamos a leer los siguientes datos, en concreto del repositorio de Github de la experta en lingüística computacional Elena Álvarez Mellado. En su repositorio tiene guardados los discursos navideños de los jefes de Estado (los democráticos y los no democráticos, desde Franco hasta Felipe VI), desde 1937 hasta 2021.

Discursos guardados en el repositorio de <https://github.com/lirondos/discursos-de-navidad>.

Imagen/gráfica 17.1: Discursos guardados en el repositorio de https://github.com/lirondos/discursos-de-navidad.

El discurso de cada año está guardado en un archivo .txt, un archivo que no tiene una estructura tabular (con filas y columnas, separadas por caracteres) como los archivos .csv. Para este tipo de archivos podemos usar read_delim, índicalo que lea cada párrafo como un «todo», con delim = "\t" (le decimos que el delimitador entre elementos sea el salto de línea).

discurso_1937 <-
  read_delim(file = "https://raw.githubusercontent.com/lirondos/discursos-de-navidad/master/data/speeches/1937.txt", delim = "\t")
discurso_1937
## # A tibble: 3 × 1
##   `COMBATIENTES de España:`                                                     
##   <chr>                                                                         
## 1 A los que estáis en las trincheras bajo la lluvia y el frío y las balas, yo o…
## 2 ¡Combatientes de España!, por la victoria de nuestra Causa, que es la Causa d…
## 3 ¡Arriba España!

De cada frase guardada (cada fila) podemos extraer cada palabra con la función str_split(), del paquete stringr, y con pattern = " " le indicamos que separe por los espacios entre las palabras.

library(stringr)
# Primera frase separando palabras
str_split(discurso_1937[1, ], pattern = " ")
## [[1]]
##   [1] "A"            "los"          "que"          "estáis"       "en"          
##   [6] "las"          "trincheras"   "bajo"         "la"           "lluvia"      
##  [11] "y"            "el"           "frío"         "y"            "las"         
##  [16] "balas,"       "yo"           "os"           "envío"        "mi"          
##  [21] "fe"           "ardiente"     "que"          "se"           "une"         
##  [26] "con"          "la"           "vuestra"      "de"           "una"         
##  [31] "próxima"      "y"            "definitiva"   "victoria."    "A"           
##  [36] "los"          "que"          "en"           "la"           "segunda"     
##  [41] "línea"        "padecéis"     "dolor"        "y"            "sufrimiento" 
##  [46] "-viudas,"     "madres;"      "hijos"        "hermanos-"    "os"          
##  [51] "mando"        "mi"           "piedad"       "y"            "mi"          
##  [56] "gratitud"     "por"          "vuestro"      "esfuerzo"     "que"         
##  [61] "es"           "el"           "combate"      "silencioso"   "de"          
##  [66] "todos"        "los"          "días"         "para"         "que"         
##  [71] "la"           "victoria"     "se"           "alcance"      "en"          
##  [76] "la"           "primera"      "línea,"       "para"         "que"         
##  [81] "sea"          "fecundo"      "y"            "duradero"     "el"          
##  [86] "afán"         "de"           "vuestros"     "combatientes" "por"         
##  [91] "la"           "instauración" "de"           "un"           "orden"       
##  [96] "nuevo."       "A"            "vosotros,"    "trabajadores" "de"          
## [101] "España,"      "que"          "dais"         "vuestras"     "fatigas"     
## [106] "por"          "una"          "España"       "mejor"        "y"           
## [111] "más"          "justa,"       "yo"           "así"          "os"          
## [116] "lo"           "prometo."     "A"            "todos"        "os"          
## [121] "mando"        "mi"           "aliento"      "y"            "mi"          
## [126] "cariño."

Ya veremos como analizar textos más en detalle.

17.4 Pisos en Boston (archivo Excel .xlsx)

Fuente original de los datos: https://doi.org/10.1016/0095-0696(78)90006-2

Muchas veces no tendremos un .csv (por desgracia) y nos tocará leer desde un excel. Para ello deberemos instalar (la primera vez) y cargar el paquete readxl que nos permitirá usar funciones para cargar archivos .xls (la función read_xls()) y archivos .xlsx (la función read_xlsx()). Además del argumento path con la ruta del archivo, podemos en el argumento sheet indicarle la hoja de Excel a leer (en caso de tener varias).

Vamos a cargar el archivo Boston.xlsx que tenemos en la carpeta de DATOS, que contienen información del valor inmobiliario de 506 distritos de Boston, y lo guardamos en un tibble.

install.packages("readxl")
library(readxl)
boston <- read_xlsx(path = "./DATOS/Boston.xlsx")
boston

El dataset Boston está basado en el estudio que realizaron Harrison and Rubinfeld, 1978 en el que se pretende determinar la disposición de los compradores para pagar más por una vivienda en un entorno con mayor calidad del aire. El conjunto de datos contiene datos del área metropolitana de Boston, con datos de 560 vecindarios, midiendo 14 variables en cada uno.

Las variables están totalmente descritas en Harrison and Rubinfeld, 1978 pero podemos resumirlas de la siguiente forma:

  • medv: variable objetivo, representa la mediana del precio inmobiliario (en miles de dolares).
  • Variables arquitectónicas: rm (número medio de habitaciones) y age (porcentaje de propiedades construidas antes de 1940).
  • Variables de vecindario: crim (tasa de criminalidad), zn (porcentaje del territorio destinado a áreas residenciales), indus (porcentaje del territorio destinado al tejido industrial), chas ( ¿hay río limitando la extensión en el territorio?), tax (coste de los servicios públicos), ptratio (ratio alumno-profesor), black (índice de población negra - sí, es un archivo vergonzoso, pero no viene mal ver los sesgo raciales de muchos de los datos que consumimos - calcualda como \(1000 ( B - 0.63)^2\), donde \(B\) es el procentaje de población negra) y lstat (porcentaje de la población con bajos ingresos).
  • Variables de accesibilidad: dis (distancia a oficinas de empleo) y rad (categoría indicando la accesibilidad a la red de autopistas, a mayor índice, mayor accesibilidad).
  • Variables de calidad del aire: nox (concentración anual de óxido de nitrógeno, en partes por 10 millones).
# Resumen del tibble
glimpse(boston)
## Rows: 506
## Columns: 14
## $ crim    <dbl> 0.00632, 0.02731, 0.02729, 0.03237, 0.06905, 0.02985, 0.08829,…
## $ zn      <dbl> 18.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.5, 12.5, 12.5, 12.5, 12.5, 1…
## $ indus   <dbl> 2.31, 7.07, 7.07, 2.18, 2.18, 2.18, 7.87, 7.87, 7.87, 7.87, 7.…
## $ chas    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ nox     <dbl> 0.538, 0.469, 0.469, 0.458, 0.458, 0.458, 0.524, 0.524, 0.524,…
## $ rm      <dbl> 6.575, 6.421, 7.185, 6.998, 7.147, 6.430, 6.012, 6.172, 5.631,…
## $ age     <dbl> 65.2, 78.9, 61.1, 45.8, 54.2, 58.7, 66.6, 96.1, 100.0, 85.9, 9…
## $ dis     <dbl> 4.0900, 4.9671, 4.9671, 6.0622, 6.0622, 6.0622, 5.5605, 5.9505…
## $ rad     <dbl> 1, 2, 2, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,…
## $ tax     <dbl> 296, 242, 242, 222, 222, 222, 311, 311, 311, 311, 311, 311, 31…
## $ ptratio <dbl> 15.3, 17.8, 17.8, 18.7, 18.7, 18.7, 15.2, 15.2, 15.2, 15.2, 15…
## $ black   <dbl> 396.90, 396.90, 392.83, 394.63, 396.90, 394.12, 395.60, 396.90…
## $ lstat   <dbl> 4.98, 9.14, 4.03, 2.94, 5.33, 5.21, 12.43, 19.15, 29.93, 17.10…
## $ medv    <dbl> 24.0, 21.6, 34.7, 33.4, 36.2, 28.7, 22.9, 27.1, 16.5, 18.9, 15…

17.5 Estadísticas del Eurostat (desde paquete)

Fuente original de los datos: Eurostat

Una opción muy común es cargar datos desde paquetes que ya los tienen incorporadas (o los consiguen a través de una API). Uno de los ejemplos más útiles seguramente sea el paquete del EUROSTATeurostat, un paquete para obtener datos abiertos de la Oficina Europea de Estadística. Puedes ver toda la documentación en https://ropengov.github.io/eurostat/articles/articles/eurostat_tutorial.html

Dicho paquete contiene la función search_eurostat(), que nos permite buscar conjuntos de datos por palabras clave (nos muestra una tabla con los datasets y sus códigos).

library(eurostat) # instalar la primera vez

# Buscamos datos por palabras clave
datos_disponibles <- search_eurostat("passengers")

# Mostramos la lista de los datos
View(datos_disponibles)

Con la función get_eurostat() podemos acceder a ellos proporcionando el código del archivo.

17.6 Datos del AEMET (desde paquete + API)

Fuente original de los datos: https://opendata.aemet.es

Una de las opciones más comunes es acceder a datos de las administraciones públicas desde R pero pasando por las API de datos abiertos de las que algunas disponen. Una API no es más que una especie de walkie-talkie para comunicarnos con aplicaciones de terceros.

Un ejemplo práctico: la API del AEMET para acceder a los datos de parte de sus estaciones meteorológicas. A través de su portal de datos abiertos (ver https://opendata.aemet.es/centrodedescargas/inicio) vamos a extraer desde R los datos meteorológicos de 291 estaciones repartidas a lo largo de toda España.

Para ello lo primero es acceder a la web https://opendata.aemet.es/centrodedescargas/obtencionAPIKey y solicitar una clave (una api key para poder usarla como «contraseña» en nuestra petición).

# Acceder a la web https://opendata.aemet.es/centrodedescargas/obtencionAPIKey desde R
browseURL("https://opendata.aemet.es/centrodedescargas/obtencionAPIKey")

Tras solicitarla y realizar los pasos que se indican en el mail que nos enviarán, obtendremos una clave similar a esta.

# Clave para conectar con la API del AEMET
api_key <- "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJqYXZhbHYwOUB1Y20uZXMiLCJqdGkiOiIwNGUwYmQzNi1jZTMxLTQ5OTQtOTdkMy1hMzc4MDc1MzlhMjgiLCJpc3MiOiJBRU1FVCIsImlhdCI6MTY0MTU0OTg4MywidXNlcklkIjoiMDRlMGJkMzYtY2UzMS00OTk0LTk3ZDMtYTM3ODA3NTM5YTI4Iiwicm9sZSI6IiJ9.RCAITYkYO_uPOzTA830tuq6LZNgmiUGuQ2vB6hrZioI"

# Definimos la api_key para toda la sesión
Sys.setenv(AEMET_API_KEY = api_key) 

El paquete que usaremos para conectarnos con el AEMET se llama climaemet, y lo podremos instalar directamente desde Github, haciendo uso del paquete devtools, y la función install_github, indicando entre paréntesis el nombre del repositorio.

# Instalamos paquete climaemet
library(devtools)
install_github("ropenspain/climaemet")

Una vez instalado el paquete podemos acceder a las estaciones con aemet_stations(), pasándole como argumento nuestra api_key (la tabla la vamos a convertir a tibble).

# Estaciones del AEMET
library(climaemet)
tabla_estaciones <- as_tibble(aemet_stations())
tabla_estaciones
## # A tibble: 291 × 7
##    indicativo indsinop nombre                 provincia altitud longitud latitud
##    <chr>      <chr>    <chr>                  <chr>       <dbl>    <dbl>   <dbl>
##  1 0252D      "08186"  ARENYS DE MAR          BARCELONA      74     2.54    41.6
##  2 0076       "08181"  BARCELONA AEROPUERTO   BARCELONA       4     2.07    41.3
##  3 0200E      ""       BARCELONA, FABRA       BARCELONA     408     2.12    41.4
##  4 0201D      "08180"  BARCELONA              BARCELONA       6     2.2     41.4
##  5 0149X      "08174"  MANRESA                BARCELONA     291     1.84    41.7
##  6 0229I      "08192"  SABADELL AEROPUERTO    BARCELONA     146     2.10    41.5
##  7 0255B      "08188"  SANTA SUSANNA          BARCELONA      40     2.70    41.7
##  8 0367       "08184"  GIRONA AEROPUERTO      GIRONA        143     2.76    41.9
##  9 0370B      ""       GIRONA, ANTIC INSTITUT GIRONA         95     2.83    42.0
## 10 0372C      "08120"  PORQUERES              GIRONA        157     2.76    42.1
## # … with 281 more rows

En la variable indicativo tenemos el código de cada estación. Vamos a acceder a los últimos registros de la estación BARCELONA AEROPUERTO con el identificador 0076, haciendo uso de la función aemet_last_obs().

datos_bcn_aeropuerto <-
  as_tibble(aemet_last_obs("0076"))
datos_bcn_aeropuerto
## # A tibble: 23 × 23
##    idema   lon fint                 prec   alt  vmax    vv    dv   lat  dmax
##    <chr> <dbl> <dttm>              <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1 0076   2.07 2022-01-29 21:00:00     0     4   2.6   1.2    20  41.3    30
##  2 0076   2.07 2022-01-29 22:00:00     0     4   2.6   1.5    30  41.3    20
##  3 0076   2.07 2022-01-29 23:00:00     0     4   6.2   4.4   360  41.3    10
##  4 0076   2.07 2022-01-30 00:00:00     0     4   7.2   4      10  41.3    10
##  5 0076   2.07 2022-01-30 01:00:00     0     4   5.7   4.2    10  41.3    10
##  6 0076   2.07 2022-01-30 02:00:00     0     4   7.7   5.8   360  41.3   360
##  7 0076   2.07 2022-01-30 03:00:00     0     4   7.2   5.6   360  41.3   360
##  8 0076   2.07 2022-01-30 04:00:00     0     4   7.7   5.6   360  41.3    10
##  9 0076   2.07 2022-01-30 05:00:00     0     4   7.2   5.3   360  41.3   360
## 10 0076   2.07 2022-01-30 06:00:00     0     4   7.7   5.5   360  41.3   360
## # … with 13 more rows, and 13 more variables: ubi <chr>, pres <dbl>, hr <dbl>,
## #   stdvv <dbl>, ts <dbl>, pres_nmar <dbl>, tamin <dbl>, ta <dbl>, tamax <dbl>,
## #   tpr <dbl>, vis <dbl>, stddv <dbl>, inso <dbl>

También podemos indicarle un rango de fechas de la que extraer información.

datos <-
  as_tibble(aemet_daily_clim("0076",
                             start = "2018-01-01",
                             end = "2021-12-31"))
datos
## # A tibble: 1,461 × 20
##    fecha      indicativo nombre     provincia altitud  tmed prec   tmin horatmin
##    <date>     <chr>      <chr>      <chr>       <dbl> <dbl> <chr> <dbl> <chr>   
##  1 2018-01-01 0076       BARCELONA… BARCELONA       4  13.2 0,0     9.7 07:27   
##  2 2018-01-02 0076       BARCELONA… BARCELONA       4  13.6 0,0     8.3 03:17   
##  3 2018-01-03 0076       BARCELONA… BARCELONA       4  16.8 0,0    10.6 05:22   
##  4 2018-01-04 0076       BARCELONA… BARCELONA       4  18.9 0,0    14.3 22:05   
##  5 2018-01-05 0076       BARCELONA… BARCELONA       4  15   0,0    10   23:53   
##  6 2018-01-06 0076       BARCELONA… BARCELONA       4  11.8 0,1     7.5 06:44   
##  7 2018-01-07 0076       BARCELONA… BARCELONA       4  11.2 6,8     6.7 23:13   
##  8 2018-01-08 0076       BARCELONA… BARCELONA       4   9.7 0,0     5.5 03:54   
##  9 2018-01-09 0076       BARCELONA… BARCELONA       4   9.6 0,0     4.6 06:20   
## 10 2018-01-10 0076       BARCELONA… BARCELONA       4  10.6 0,0     6.4 08:01   
## # … with 1,451 more rows, and 11 more variables: tmax <dbl>, horatmax <chr>,
## #   dir <chr>, velmedia <dbl>, racha <dbl>, horaracha <chr>, sol <dbl>,
## #   presMax <dbl>, horaPresMax <chr>, presMin <dbl>, horaPresMin <chr>

Datos desde el AEMET a nuestro R, listos para analizar.

17.7 Canciones de Spotify (desde paquete + API)

17.8 Tweets de Twitter (desde paquete + API)

17.9 Datos de Our World in Data (paquete)

Uno de los protagonistas de los últimos años debido a la pandemia ha sido la web Our World in Data, y en concreto los datos que han recopilado de covid y vacunación de todos los países del mundo. Y sí, podemos acceder a ellos directamente desde R a través del paquete {owidR}.

library(owidR)

Con la función owid_search() podemos introducir una palabra clave, para obtener el listado de datasets y su palabra clave.

17.10 Datos electorales (desde paquete + API)

Fuente original de los datos: http://www.infoelectoral.mir.es/infoelectoral

Aunque aún funcionan con algunas limitaciones, también existen ya paquetes para poder descargarnos directamente los datos de cualquier proceso electoral celebrado en España. Una de esas herramientas es el paquete infoelectoral, que podemos instalar desde el repositorio ropenspain/infoelectoral.

library(devtools)
install_github("ropenspain/infoelectoral")
library(infoelectoral)

Dicho paquete nos permite con municipios() descargarnos directamente los resultados electorales a nivel municipal por tipo de elección (tipo_eleccion), año (anno) y mes (mes). Veamos un ejemplo con las elecciones generales de noviembre de 2019.

datos_2019 <- municipios(tipo_eleccion = "congreso",
                       anno = 2019, mes = 11)

Tiene otras funciones para descargar los datos a nivel de mesa electoral. Puedes consultar más paquetes relacionados con API de la administración y sus plataformas de microdatos (INE, BOE, etc) en https://ropenspain.es/paquetes/

17.11 Partidas de ajedrez (desde Github)

Fuente original de los datos: https://chess.com

En R se pueden cargar los datos más varipintos que te imaginas. A veces los códigos o paquetes no siempre están aprobados como paquete pero podemos instalarlos directamente desde Github, haciendo uso del paquete devtools, y la función install_github, indicando entre paréntesis el nombre del repositorio. En este caso vamos a usar un repositorio (https://github.com/JaseZiv/chessR) que nos permitirá analizar partidas de ajedrez de https://chess.com.

# Instalamos paquete desde Github
library(devtools)
install_github("JaseZiv/chessR")

Una vez instalado vamos a acceder al historial de mis partidas de ajedres usando mi usuario en dicha plataforma usernames = "dadosdelaplace".

# Accedemos a datos de chess.com
library(chessR)
datos <- get_game_data(usernames = "dadosdelaplace")
head(datos)
##   rules time_class      Event      Site       Date Round             White
## 1 chess      blitz Live Chess Chess.com 2020-11-18     -    DadosDeLaplace
## 2 chess      blitz Live Chess Chess.com 2020-11-18     - Gotham_darkKnight
## 3 chess      blitz Live Chess Chess.com 2020-11-18     -    DadosDeLaplace
## 4 chess      blitz Live Chess Chess.com 2020-11-18     -        iankyle124
## 5 chess      blitz Live Chess Chess.com 2020-11-18     -    DadosDeLaplace
## 6 chess      rapid Live Chess Chess.com 2020-11-18     -       FilipKing22
##            Black Result
## 1      marchhh67    0-1
## 2 DadosDeLaplace    1-0
## 3        eloycob    0-1
## 4 DadosDeLaplace    1-0
## 5        Jatin68    0-1
## 6 DadosDeLaplace    0-1
##                                                   CurrentPosition Timezone ECO
## 1   r2qkbnr/ppp1pppp/2n5/3p4/3PP1b1/5N2/PPP2PPP/RNBQKB1R w KQkq -      UTC B00
## 2                  rn2k3/ppp2rPQ/8/3P4/2B4P/N7/P4B2/b3K2R w KQq -      UTC C23
## 3   r2qkbnr/1ppn1pp1/p2pp2p/3P4/4P3/2N2N2/P1P2PPP/R1BQKR2 w Qkq -      UTC C00
## 4                       8/p1p5/2B5/1P1Rp1Kp/2k1P1P1/8/4r3/8 b - -      UTC C25
## 5 r1bqkb1r/pp1np1pp/2p2p1n/3p4/3P3B/2N5/PPP1PPPP/RQ2KBNR w KQkq -      UTC D00
## 6    rnb1k2r/p4ppp/2p5/8/1bP1n1P1/1N2P2P/PP1P1qB1/RNBQ1K1R w kq -      UTC C40
##                                                                                          ECOUrl
## 1                     https://www.chess.com/openings/Nimzowitsch-Defense-Scandinavian-Variation
## 2                                    https://www.chess.com/openings/Bishops-Opening-Khan-Gambit
## 3                                https://www.chess.com/openings/French-Defense-Normal-Variation
## 4                                             https://www.chess.com/openings/Vienna-Game-2...d6
## 5                         https://www.chess.com/openings/Queens-Pawn-Opening-Chigorin-Variation
## 6 https://www.chess.com/openings/Kings-Pawn-Opening-Kings-Knight-Elephant-Paulsen-Countergambit
##      UTCDate  UTCTime WhiteElo BlackElo TimeControl
## 1 2020.11.18 17:53:26      584      736         180
## 2 2020.11.18 17:55:52      512      436         180
## 3 2020.11.18 18:00:33      368      540         180
## 4 2020.11.18 18:02:45      421      304         300
## 5 2020.11.18 18:10:38      234      278         300
## 6 2020.11.18 18:19:09      774      982         600
##                            Termination StartTime    EndDate  EndTime
## 1       marchhh67 won - game abandoned  17:53:26 2020-11-18 17:54:41
## 2 Gotham_darkKnight won by resignation  17:55:52 2020-11-18 18:00:22
## 3           eloycob won by resignation  18:00:33 2020-11-18 18:02:23
## 4               iankyle124 won on time  18:02:45 2020-11-18 18:10:05
## 5         Jatin68 won - game abandoned  18:10:38 2020-11-18 18:12:02
## 6      DadosDeLaplace won by checkmate  18:19:09 2020-11-18 18:23:08
##                                         Link
## 1 https://www.chess.com/game/live/5771307946
## 2 https://www.chess.com/game/live/5771323289
## 3 https://www.chess.com/game/live/5771354149
## 4 https://www.chess.com/game/live/5771367684
## 5 https://www.chess.com/game/live/5771419623
## 6 https://www.chess.com/game/live/5771474982
##                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             Moves
## 1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            \n1. d4 {[%clk 0:02:57.5]} 1... d5 {[%clk 0:02:59.5]} 2. e4 {[%clk 0:02:52.2]} 2... Nc6 {[%clk 0:02:58]} 3. Nf3 {[%clk 0:02:46.7]} 3... Bg4 {[%clk 0:02:55.5]} 0-1\n
## 2                                                                                                                                                                                                                                                                                                                                                                                                                                                 \n1. e4 {[%clk 0:02:59.9]} 1... e5 {[%clk 0:02:56.6]} 2. Bc4 {[%clk 0:02:58.5]} 2... d5 {[%clk 0:02:42.6]} 3. exd5 {[%clk 0:02:55.4]} 3... Nf6 {[%clk 0:02:30.4]} 4. Nf3 {[%clk 0:02:51.8]} 4... Bg4 {[%clk 0:02:20.5]} 5. h3 {[%clk 0:02:47.6]} 5... Bh5 {[%clk 0:02:18.1]} 6. g4 {[%clk 0:02:45.6]} 6... Bg6 {[%clk 0:02:11.1]} 7. g5 {[%clk 0:02:43]} 7... Ne4 {[%clk 0:02:00.7]} 8. h4 {[%clk 0:02:37.8]} 8... Bh5 {[%clk 0:01:55.2]} 9. b4 {[%clk 0:02:28]} 9... Bxb4 {[%clk 0:01:48.3]} 10. c3 {[%clk 0:02:24.1]} 10... Ba5 {[%clk 0:01:45.5]} 11. d3 {[%clk 0:02:21]} 11... Bxf3 {[%clk 0:01:34.3]} 12. Qxf3 {[%clk 0:02:18.3]} 12... f5 {[%clk 0:01:16.1]} 13. dxe4 {[%clk 0:02:15.7]} 13... g6 {[%clk 0:01:07.5]} 14. exf5 {[%clk 0:02:12.8]} 14... gxf5 {[%clk 0:01:04.4]} 15. Qxf5 {[%clk 0:02:10.6]} 15... Rf8 {[%clk 0:00:49.8]} 16. Qxh7 {[%clk 0:02:07.7]} 16... e4 {[%clk 0:00:38.6]} 17. Na3 {[%clk 0:02:03.9]} 17... Bxc3+ {[%clk 0:00:31.4]} 18. Bd2 {[%clk 0:01:57.5]} 18... Bxa1 {[%clk 0:00:29.4]} 19. g6 {[%clk 0:01:52.1]} 19... e3 {[%clk 0:00:22.6]} 20. Bxe3 {[%clk 0:01:49.2]} 20... Qf6 {[%clk 0:00:13.4]} 21. g7 {[%clk 0:01:46.8]} 21... Qxf2+ {[%clk 0:00:09.9]} 22. Bxf2 {[%clk 0:01:39.9]} 22... Rf7 {[%clk 0:00:02.6]} 1-0\n
## 3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   \n1. d4 {[%clk 0:02:54.1]} 1... e6 {[%clk 0:02:58.8]} 2. e4 {[%clk 0:02:52.3]} 2... h6 {[%clk 0:02:58.2]} 3. Nc3 {[%clk 0:02:50.9]} 3... a6 {[%clk 0:02:57.7]} 4. Nf3 {[%clk 0:02:39.3]} 4... d6 {[%clk 0:02:57.6]} 5. b4 {[%clk 0:02:31.6]} 5... Bd7 {[%clk 0:02:56.8]} 6. b5 {[%clk 0:02:24.8]} 6... Bxb5 {[%clk 0:02:46.6]} 7. d5 {[%clk 0:02:00]} 7... Bxf1 {[%clk 0:02:44.5]} 8. Rxf1 {[%clk 0:01:48]} 8... Nd7 {[%clk 0:02:41.1]} 0-1\n
## 4 \n1. e4 {[%clk 0:04:58.9]} 1... e5 {[%clk 0:04:56.1]} 2. Nc3 {[%clk 0:04:57.1]} 2... d6 {[%clk 0:04:49.3]} 3. Bc4 {[%clk 0:04:55.4]} 3... Nf6 {[%clk 0:04:28.4]} 4. Nf3 {[%clk 0:04:54.2]} 4... Bg4 {[%clk 0:04:24.5]} 5. h3 {[%clk 0:04:51.8]} 5... Bh5 {[%clk 0:04:23.3]} 6. Nxe5 {[%clk 0:04:50.3]} 6... Bxd1 {[%clk 0:04:20.4]} 7. Bxf7+ {[%clk 0:04:48.3]} 7... Ke7 {[%clk 0:04:05.9]} 8. Nd5+ {[%clk 0:04:39.9]} 8... Nxd5 {[%clk 0:03:28.2]} 9. Bxd5 {[%clk 0:04:35.1]} 9... dxe5 {[%clk 0:03:16.7]} 10. O-O {[%clk 0:04:28.4]} 10... Bxc2 {[%clk 0:03:03.8]} 11. d3 {[%clk 0:04:21.5]} 11... Bxd3 {[%clk 0:02:58.8]} 12. Bg5+ {[%clk 0:04:17.8]} 12... Kd7 {[%clk 0:02:38.7]} 13. Rad1 {[%clk 0:04:06.5]} 13... Bxf1 {[%clk 0:02:29]} 14. Bxb7+ {[%clk 0:04:03.9]} 14... Ke6 {[%clk 0:02:14.6]} 15. Bxd8 {[%clk 0:03:59]} 15... Be7 {[%clk 0:01:48.2]} 16. Bxe7 {[%clk 0:03:52.4]} 16... Kxe7 {[%clk 0:01:46.8]} 17. Bxa8 {[%clk 0:03:48.5]} 17... Nc6 {[%clk 0:01:37.5]} 18. Bxc6 {[%clk 0:03:44.3]} 18... Rf8 {[%clk 0:01:32.8]} 19. Rxf1 {[%clk 0:03:42.8]} 19... Kd6 {[%clk 0:01:19.1]} 20. Rc1 {[%clk 0:03:29]} 20... g5 {[%clk 0:01:15]} 21. b4 {[%clk 0:03:27.6]} 21... h5 {[%clk 0:01:07.3]} 22. b5 {[%clk 0:03:25.2]} 22... g4 {[%clk 0:01:05.8]} 23. g3 {[%clk 0:03:23.6]} 23... gxh3 {[%clk 0:01:03.1]} 24. Kh2 {[%clk 0:03:20.9]} 24... Rxf2+ {[%clk 0:00:56.7]} 25. Kxh3 {[%clk 0:03:14.3]} 25... Rxa2 {[%clk 0:00:45.5]} 26. Rd1+ {[%clk 0:03:12.5]} 26... Kc5 {[%clk 0:00:27.9]} 27. Rd5+ {[%clk 0:03:07]} 27... Kc4 {[%clk 0:00:18.3]} 28. Kh4 {[%clk 0:03:03.5]} 28... Rh2+ {[%clk 0:00:15.4]} 29. Kg5 {[%clk 0:02:57.9]} 29... Re2 {[%clk 0:00:00.7]} 30. g4 {[%clk 0:02:55.1]} 1-0\n
## 5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               \n1. d4 {[%clk 0:04:59.1]} 1... d5 {[%clk 0:04:58.2]} 2. Nc3 {[%clk 0:04:54.4]} 2... c6 {[%clk 0:04:56.9]} 3. Bg5 {[%clk 0:04:47.1]} 3... f6 {[%clk 0:04:50.8]} 4. Bh4 {[%clk 0:04:45.9]} 4... Nd7 {[%clk 0:04:43.6]} 5. Qb1 {[%clk 0:04:36.8]} 5... Nh6 {[%clk 0:04:37.9]} 0-1\n
## 6                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \n1. e4 {[%clk 0:09:53.2]} 1... e5 {[%clk 0:09:58.5]} 2. Nf3 {[%clk 0:09:48.6]} 2... d5 {[%clk 0:09:55.1]} 3. exd5 {[%clk 0:09:43.2]} 3... e4 {[%clk 0:09:53.7]} 4. Nd4 {[%clk 0:09:38.6]} 4... Bb4 {[%clk 0:09:47.4]} 5. c3 {[%clk 0:09:34.7]} 5... Ba5 {[%clk 0:09:46.2]} 6. c4 {[%clk 0:09:20.9]} 6... e3 {[%clk 0:09:40.4]} 7. fxe3 {[%clk 0:09:09.7]} 7... Nf6 {[%clk 0:09:36.4]} 8. Nb3 {[%clk 0:08:56.8]} 8... Bb4 {[%clk 0:09:30.9]} 9. h3 {[%clk 0:08:32.6]} 9... c6 {[%clk 0:09:22.4]} 10. dxc6 {[%clk 0:08:19.8]} 10... bxc6 {[%clk 0:09:19.1]} 11. g4 {[%clk 0:08:18.2]} 11... Ne4 {[%clk 0:09:09.8]} 12. Bg2 {[%clk 0:07:57]} 12... Qh4+ {[%clk 0:09:03.6]} 13. Kf1 {[%clk 0:07:30.2]} 13... Qf2# {[%clk 0:08:37.7]} 0-1\n
##   winner       Username n_Moves      UserOpponent UserColour OpponentColour
## 1  Black dadosdelaplace       3    DadosDeLaplace      Black          White
## 2  White dadosdelaplace      22 Gotham_darkKnight      Black          White
## 3  Black dadosdelaplace       8    DadosDeLaplace      Black          White
## 4  White dadosdelaplace      30        iankyle124      Black          White
## 5  Black dadosdelaplace       5    DadosDeLaplace      Black          White
## 6  Black dadosdelaplace      13       FilipKing22      Black          White
##   UserELO OpponentELO UserResult DaysTaken                  GameEnding
## 1     736         584        Win    0 days     marchhh67game abandoned
## 2     436         512       Loss    0 days              by resignation
## 3     540         368        Win    0 days      eloycob by resignation
## 4     304         421       Loss    0 days                     on time
## 5     278         234        Win    0 days       Jatin68game abandoned
## 6     982         774        Win    0 days DadosDeLaplace by checkmate
##                                                    Opening
## 1                           Defense-Scandinavian-Variation
## 2                                      Opening-Khan-Gambit
## 3                                 Defense-Normal-Variation
## 4                                              Game-2...d6
## 5                          Pawn-Opening-Chigorin-Variation
## 6 Pawn-Opening-Kings-Knight-Elephant-Paulsen-Countergambit

17.12 Encuestas electorales (desde la wikipedia)

Otra forma muy cómoda de cargar datos es desde web sencillas como la wikipedia. Para ver un ejemplo vamos a cargar las encuestas electorales que había disponibles para las últimas elecciones alemanas, desde el enlace https://es.wikipedia.org/wiki/Elecciones_federales_de_Alemania_de_2021

wiki <- paste0("https://es.wikipedia.org/wiki/",
              "Elecciones_federales_de_Alemania_de_2021")

Con read_html, del paquete rvest, accederemos al código HTML de la página web indicada, y con html_nodes podremos indicarle que queremos seleccionar solo las tablas.

library(rvest)
html <- read_html(wiki)
tablas <- html_nodes(html, ".wikitable")

Con html_table podremos indicarle cual de las tablas queremos leer (están guardados en la lista tablas).

tabla_encuestas_bruto <- html_table(tablas[[5]], header = FALSE)
tabla_encuestas_bruto
## # A tibble: 124 × 10
##    X1              X2        X3     X4     X5      X6    X7    X8    X9    X10  
##    <chr>           <chr>     <chr>  <chr>  <chr>   <chr> <chr> <chr> <chr> <chr>
##  1 Encuesta        Fecha     Muest… "SPD"  "CDU/C… "Grü… "FDP" "AfD" "Lin… Otros
##  2 Encuesta        Fecha     Muest… ""     ""      ""    ""    ""    ""    Otros
##  3 Wahlkreisprogn… 22–24 Se… 1,400  "25.5" "22.5"  "14"  "12"  "11"  "7"   8    
##  4 Ipsos[85]       22–23 Se… 2,000  "26"   "22"    "16"  "12"  "11"  "7"   6    
##  5 Forschungsgrup… 22–23 Se… 1,273  "25"   "23"    "16.… "11"  "10"  "6"   8.5  
##  6 Forsa[87]       20–23 Se… 2,002  "25"   "22"    "17"  "12"  "10"  "6"   8    
##  7 Allensbach[88]  16–23 Se… 1,554  "26"   "25"    "16"  "10.… "10"  "5"   7.5  
##  8 Civey[89]       16–23 Se… 10,012 "25"   "23"    "16"  "12"  "10"  "6"   8    
##  9 YouGov[90]      16–22 Se… 2,364  "25"   "21"    "14"  "11"  "12"  "7"   9    
## 10 Wahlkreisprogn… 20–21 Se… 1,801  "25"   "21.5"  "15"  "12.… "11"  "6.5" 8.5  
## # … with 114 more rows
names(tabla_encuestas_bruto)
##  [1] "X1"  "X2"  "X3"  "X4"  "X5"  "X6"  "X7"  "X8"  "X9"  "X10"

17.13 Exportación de datos

Aunque se puede exportar en cualquier formato que puedas importar, vamos a ver las dos formas más útiles y eficientes de exportar datos en R:

  • fichero .RData.
  • fichero .csv (obviaremos la exportación a Excel).

La exportación en fichero .RData es la opción más recomendable si tú o tu equipo solo trabajáis con R, es la opción nativa de fichero, para que su importación sea tan sencilla como una función load(). Para exportar en R.Data basta con uses la función save(), indícandole lo que quieres guardar y la ruta donde quieres guardarlo.

Es importante entender que la principal ventaja de exportar un fichero .RData es que no se está portando una tabla, o un fichero tabulado con un formato de filas y columnas: estás exportando cualquier cosa, cualquier variable de R, con la naturaleza de esa variable intacta, sin necesidad de pasarlo otro formato.

nombres <- c("javier", "carla")
# Exportamos en .RData la variable nombres 
save(nombres, file = "./EXPORTAR/nombres.RData")

Para tenerlo organizado, la orden anterior está hecha habiendo creado en nuestra carpeta del proyecto una carpeta EXPORTAR para guardar lo que vayamos exportando. Ese fichero solo podrá ser abierto por R, pero cuando lo cargemos, tendremos la variable nombres tal cual la hemos guardado.

 

No siempre trabajamos en R y a veces necesitamos una exportación de un data.frame o una tabla que podamos abrir en nuestra ordenador, ya sea para explicársela a alguien o para enviársela a otra persona. Para ello exportaremos en .csv, un fichero sin formato, y que es capaz de ser abierto por todo tipo de hojas de cálculo: basta que usemos la función write.csv().

# Exportamos en .csv el data.frame del ISCIII
write_csv(datos_ISCIII, file = "./EXPORTAR/datos_ISCIII.csv")

 

De la misma manera vamos a exportar el fichero de encuestas de Alemania que hemos leído desde la wikipedia.

write_csv(tabla_encuestas_bruto,
          "./EXPORTAR/encuestas_alemania_bruto.csv")

WARNING: líneas de código en los errores

Dado que los errores del código nos vendrán referenciados en la consola por el número de línea donde fueron detectados, puede sernos muy útil mostrar dichos números en la barra lateral izquierda, yendo a Tools << Global Options << Code << Display << Show line numbers

Líneas de código.

Imagen/gráfica 17.2: Líneas de código.

17.14 Consejos

CONSEJOS

 

Margen derecho en la ventana de scripts

Aunque no afecte a nuestro código escribir todo en una línea sin saltos de línea, no somos bárbaros/as. ¿Por qué cuadno escribes en un Word lo haces en formato vertical pero cuando programas pones todas las órdenes seguidas? Recuerda que la legibilidad de tu código no solo te ahorrará tiempo sino que te hará programar mejor. ¿Cómo podemos fijar un margen imaginario para nosotros ser quienes demos al ENTER? Yendo a Tools << Global Options << Code << Display << Show margin (es un margen imaginario para ser nosotros quienes lo hagamos efectivo, a R le da igual)

Margen derecho.

Imagen/gráfica 17.3: Margen derecho.