Capítulo 8 Importando/exportando

Hemos aprendido a crear nuestros propios datos pero la mayoría de veces los cargaremos de distintos archivos, fuentes, etc. Vamos a ver algunas de las formas más comunes de importar (cargar) datos.

8.1 Importación de datos

Las formas más comunes de importar (cargar) datos son:

  • desde un archivo propio de R (extensión .RData).
  • desde un archivo separado por comas (un archivo .csv).
  • desde un excel (archivo .xlsx).
  • desde un enlace de internet.
  • desde un paquete.

8.1.1 Archivo .RData

La forma más sencilla de guardar datos y variables en R, y que además ocupa menos espacio en nuestro disco duro, es guardarlo en archivos propios que tiene R como son los archivos con extensiones .rda y .RData.

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 del proyecto tenemos 4 archivos .RData: coches.RData, panel_vacunas_ccaa.RData, panel_vacunas_fecha.RData y panel_variables.RData. ¿Cómo cargar archivos .RData?

Muy sencillo: como son ficheros nativos de R, basta con usar la función de carga load(), y dentro la ruta de los archivos.

# Al fijar directorio de trabajo, no necesitamos toda la ruta, solo "./" y la ruta dentro de la carpeta del proyecto
load("./DATOS/coches.RData") 
load("./DATOS/panel_vacunas_ccaa.RData")
load("./DATOS/panel_vacunas_fecha.RData")
load("./DATOS/panel_variables.RData")
Importación de ficheros de extensión .RData.

Imagen/gráfica 8.1: Importación de ficheros de extensión .RData.

Como ves en la imagen 8.1, en el panel de entorno de la parte superior derecha ahora tendremos 4 data.frames que antes no teníamos. Un función muy útil es head(), con argumento el nombre de un data.frame, que nos permite visualizar las primeras columnas.

# Ver las primeras filas de la tabla que guarda distintos modelos de coche y características
head(coches)
##                    consumo cilindrada     peso  potencia   tiempo
## Mazda RX4         11.20069   2621.936 1188.411 111.52570 40.91298
## Mazda RX4 Wag     11.20069   2621.936 1304.077 111.52570 42.30491
## Datsun 710        10.31643   1769.807 1052.333  94.28991 46.25702
## Hornet 4 Drive    10.99134   4227.872 1458.298 111.52570 48.32006
## Hornet Sportabout 12.57832   5899.356 1560.356 177.42725 42.30491
## Valiant           12.99528   3687.097 1569.428 106.45635 50.25883
##                                motor transmision ncyl ncarb ngear
## Mazda RX4             cilindros en V      Manual    6     4     4
## Mazda RX4 Wag         cilindros en V      Manual    6     4     4
## Datsun 710        cilindros en serie      Manual    4     1     4
## Hornet 4 Drive    cilindros en serie  Automática    6     1     3
## Hornet Sportabout     cilindros en V  Automática    8     2     3
## Valiant           cilindros en serie  Automática    6     1     3

8.1.2 Archivo .csv

Otra opción de importación habitual son los archivos .csv (comma separated values): son archivos 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 basta con usar la función read_csv() del paquete readr y la mayoría de las veces basta indicarle la ruta del archivo para su lectura (argumento file).

Paquete readr.

Imagen/gráfica 8.2: Paquete readr.

install.packages("readr")
library(readr)
vacunas_esp <- read_csv(file = "./DATOS/datos_ES.csv")
head(vacunas_esp)
## # A tibble: 6 × 71
##   fechas     ISO   poblacion porc_pobl_total poblacion_mayor_… porc_pobl_total_…
##   <date>     <chr>     <dbl>           <dbl>             <dbl>             <dbl>
## 1 2021-01-05 ES     47450795             100          40129822               100
## 2 2021-01-06 ES     47450795             100          40129822               100
## 3 2021-01-07 ES     47450795             100          40129822               100
## 4 2021-01-08 ES     47450795             100          40129822               100
## 5 2021-01-09 ES     47450795             100          40129822               100
## 6 2021-01-10 ES     47450795             100          40129822               100
## # … with 65 more variables: dosis_entrega_pfizer <dbl>,
## #   dosis_entrega_astra <dbl>, dosis_entrega_moderna <dbl>,
## #   dosis_entrega_janssen <dbl>, dosis_entrega <dbl>,
## #   dosis_entrega_100hab <dbl>, porc_entregadas_sobre_total <dbl>,
## #   dosis_diarias_entrega_pfizer <dbl>, dosis_diarias_entrega_astra <dbl>,
## #   dosis_diarias_entrega_moderna <dbl>, dosis_diarias_entrega <dbl>,
## #   dosis_7D_entrega_pfizer <dbl>, dosis_7D_entrega_astra <dbl>, …
vacunas_esp[1:5, 1:7] # Primeras filas y columnas
## # A tibble: 5 × 7
##   fechas     ISO   poblacion porc_pobl_total poblacion_mayor_… porc_pobl_total_…
##   <date>     <chr>     <dbl>           <dbl>             <dbl>             <dbl>
## 1 2021-01-05 ES     47450795             100          40129822               100
## 2 2021-01-06 ES     47450795             100          40129822               100
## 3 2021-01-07 ES     47450795             100          40129822               100
## 4 2021-01-08 ES     47450795             100          40129822               100
## 5 2021-01-09 ES     47450795             100          40129822               100
## # … with 1 more variable: dosis_entrega_pfizer <dbl>

Ya tenemos nuestro archivo .csv cargado y además en formato tibble. Como hemos mentado anteriormente, las tablas en formato tibble son una especie particular de tablas data.frame con una gestión más eficiente.

8.1.3 Archivo .xlsx

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).

install.packages("readxl")
library(readxl)
boston <- read_xlsx(path = "./DATOS/Boston.xlsx")
head(boston)
## # A tibble: 6 × 14
##      crim    zn indus  chas   nox    rm   age   dis   rad   tax ptratio black
##     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>   <dbl> <dbl>
## 1 0.00632    18  2.31     0 0.538  6.58  65.2  4.09     1   296    15.3  397.
## 2 0.0273      0  7.07     0 0.469  6.42  78.9  4.97     2   242    17.8  397.
## 3 0.0273      0  7.07     0 0.469  7.18  61.1  4.97     2   242    17.8  393.
## 4 0.0324      0  2.18     0 0.458  7.00  45.8  6.06     3   222    18.7  395.
## 5 0.0690      0  2.18     0 0.458  7.15  54.2  6.06     3   222    18.7  397.
## 6 0.0298      0  2.18     0 0.458  6.43  58.7  6.06     3   222    18.7  394.
## # … with 2 more variables: lstat <dbl>, medv <dbl>

8.1.4 Desde web

Muchas veces querremos cargar archivos colgados en la web que, aunque al descargarlos son .csv o .xlsx, son archivos dinámicos que sabemos que van a ir cambiando, como por ejemplo los datos de casos covid, hospitalizados, ingresos UCI y fallecidos, de la página del ISCIII https://cnecovid.isciii.es/covid19/#documentaci%C3%B3n-y-datos.

Archivos de la pandemia en el ISCIII.

Imagen/gráfica 8.3: Archivos de la pandemia en el ISCIII.

Esos archivos cambian cada día, por lo que para visualizarlos, analizarlos o guardarlos cada día, tendríamos que, cada día, entrar de forma manual a la página y bajarnos el archivo. O no…

R nos permite leer archivos subidos en una web, dándole a la función de lectura el enlace del archivo en lugar de la ruta local de nuestro ordenador (para averiguar el enlace, basta con clickar botón derecho en la web y seleccionar «copiar dirección de enlace»)

datos_ISCIII <- read_csv(file = "https://cnecovid.isciii.es/covid19/resources/casos_hosp_uci_def_sexo_edad_provres.csv")
head(datos_ISCIII)
## # A tibble: 6 × 8
##   provincia_iso sexo  grupo_edad fecha      num_casos num_hosp num_uci num_def
##   <chr>         <chr> <chr>      <date>         <dbl>    <dbl>   <dbl>   <dbl>
## 1 A             H     0-9        2020-01-01         0        0       0       0
## 2 A             H     10-19      2020-01-01         0        0       0       0
## 3 A             H     20-29      2020-01-01         0        0       0       0
## 4 A             H     30-39      2020-01-01         0        0       0       0
## 5 A             H     40-49      2020-01-01         0        0       0       0
## 6 A             H     50-59      2020-01-01         0        0       0       0

Mientras el enlace web no cambie, cada vez que ejecutemos esa orden en nuestro código tendremos en datos_ISCIII el último archivo actualizado que haya, sea el que sea, sin tener que descargarlo de forma manual, ¡y sin necesidad de guardarlo en nuestro local, solo en la memoria virtual de nuestra sesión de R!

8.1.5 Desde paquete

Por último, una opción muy común es cargar datos desde paquetes que ya los tienen (o los consiguen a través de API). Un ejemplo de ello es el paquete MASS, que contiene una gran cantidad de conjuntos de datos para usarlos en nuestro propio aprendizaje, como es el conjunto MASS::Boston con los datos de viviendas de los suburbios de la ciudad, o el paquete {datasets}, con conjuntos de datos tan variopintos como los pasajeros del Titanic (y si sobrevivieron o no) en datasets::Titanic.

head(MASS::Boston)
##      crim zn indus chas   nox    rm  age    dis rad tax ptratio  black lstat
## 1 0.00632 18  2.31    0 0.538 6.575 65.2 4.0900   1 296    15.3 396.90  4.98
## 2 0.02731  0  7.07    0 0.469 6.421 78.9 4.9671   2 242    17.8 396.90  9.14
## 3 0.02729  0  7.07    0 0.469 7.185 61.1 4.9671   2 242    17.8 392.83  4.03
## 4 0.03237  0  2.18    0 0.458 6.998 45.8 6.0622   3 222    18.7 394.63  2.94
## 5 0.06905  0  2.18    0 0.458 7.147 54.2 6.0622   3 222    18.7 396.90  5.33
## 6 0.02985  0  2.18    0 0.458 6.430 58.7 6.0622   3 222    18.7 394.12  5.21
##   medv
## 1 24.0
## 2 21.6
## 3 34.7
## 4 33.4
## 5 36.2
## 6 28.7
head(datasets::Titanic)
## [1]  0  0 35  0  0  0

Veamos otro ejemplo con uno de los paquetes más útiles para conseguir datos, el paquete del EUROSTAT.

library(eurostat)

# Buscamos datos por palabras clave
search_eurostat("education")
## # A tibble: 1,062 × 8
##    title   code  type  `last update of… `last table str… `data start` `data end`
##    <chr>   <chr> <chr> <chr>            <chr>            <chr>        <chr>     
##  1 Popula… cens… data… 01.04.2019       08.02.2021       2011         2011      
##  2 Popula… cens… data… 26.08.2015       08.02.2021       2011         2011      
##  3 Employ… cens… data… 26.03.2009       08.02.2021       2001         2001      
##  4 Popula… cens… data… 26.03.2009       08.02.2021       2001         2001      
##  5 Pupils… educ… data… 14.12.2021       08.02.2021       2013         2019      
##  6 Pupils… educ… data… 14.12.2021       08.02.2021       2013         2019      
##  7 Pupils… educ… data… 14.12.2021       08.02.2021       2013         2019      
##  8 Pupils… educ… data… 14.12.2021       08.02.2021       2013         2019      
##  9 Pupils… educ… data… 14.12.2021       08.02.2021       2013         2019      
## 10 Studen… educ… data… 14.12.2021       08.02.2021       2013         2019      
## # … with 1,052 more rows, and 1 more variable: values <chr>
# Accedemos a un dato concreto por codigo
get_eurostat("hlth_ehis_de3")
## # A tibble: 1,536 × 6
##    sex   age    isced97 geo   time       values
##    <chr> <chr>  <chr>   <chr> <date>      <dbl>
##  1 F     TOTAL  ED0-2   BE    2008-01-01   19.1
##  2 F     TOTAL  ED3_4   BE    2008-01-01   20.2
##  3 F     TOTAL  ED5_6   BE    2008-01-01   11.5
##  4 F     TOTAL  TOTAL   BE    2008-01-01   17  
##  5 F     Y15-24 ED0-2   BE    2008-01-01   17.1
##  6 F     Y15-24 ED3_4   BE    2008-01-01   21.3
##  7 F     Y15-24 ED5_6   BE    2008-01-01   10.3
##  8 F     Y15-24 TOTAL   BE    2008-01-01   16.1
##  9 F     Y25-34 ED0-2   BE    2008-01-01   29.3
## 10 F     Y25-34 ED3_4   BE    2008-01-01   27.4
## # … with 1,526 more rows

8.2 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 porque un .csv ya es posible abrirlo con dicho engendro del demonio).

8.2.1 Guardar en .RData

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.

# 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.

8.2.2 Guardar en .csv

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() del paquete readr.

# Exportamos en .csv el data.frame tabla
write_csv(tabla, file = "./EXPORTAR/tabla.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 8.4: Líneas de código.

8.3 Consejos

CONSEJOS

 

Paquete rvest

En dicho paquete tienes más funciones para una lectura directamente como si navegaras por una página web. Ver https://github.com/tidyverse/rvest.

# Ejemplo cargando datos de una tabla de wikipedia: 
# encuestas elecciones alemanas 2021
library(rvest)
library(tidyverse)
wiki <- paste0("https://es.wikipedia.org/wiki/",
              "Elecciones_federales_de_Alemania_de_2021")
html<- read_html(wiki)
datos <- html_nodes(html,".wikitable")

# Tabla (tibble) (e ignoramos filas con algún valores ausentes)
resultados_encuestas <-
  html_table(datos[[5]], header = TRUE) %>% drop_na()

# Resumen de columnas: casa encuestadora, fecha, muestra, partidos
glimpse(resultados_encuestas)
## Rows: 122
## Columns: 10
## $ Encuesta  <chr> "Wahlkreisprognose[84]", "Ipsos[85]", "Forschungsgruppe Wahl…
## $ Fecha     <chr> "22–24 Sep 2021", "22–23 Sep 2021", "22–23 Sep 2021", "20–23…
## $ Muestra   <chr> "1,400", "2,000", "1,273", "2,002", "1,554", "10,012", "2,36…
## $ SPD       <dbl> 25.5, 26.0, 25.0, 25.0, 26.0, 25.0, 25.0, 25.0, 25.0, 25.0, …
## $ `CDU/CSU` <dbl> 22.5, 22.0, 23.0, 22.0, 25.0, 23.0, 21.0, 21.5, 21.0, 22.0, …
## $ Grüne     <dbl> 14.0, 16.0, 16.5, 17.0, 16.0, 16.0, 14.0, 15.0, 16.0, 15.0, …
## $ FDP       <dbl> 12.0, 12.0, 11.0, 12.0, 10.5, 12.0, 11.0, 12.5, 11.0, 12.0, …
## $ AfD       <dbl> 11.0, 11.0, 10.0, 10.0, 10.0, 10.0, 12.0, 11.0, 11.0, 11.0, …
## $ Linke     <dbl> 7.0, 7.0, 6.0, 6.0, 5.0, 6.0, 7.0, 6.5, 7.0, 6.5, 6.0, 6.0, …
## $ Otros     <chr> "8", "6", "8.5", "8", "7.5", "8", "9", "8.5", "9", "8.5", "8…

 

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 8.5: Margen derecho.