4.1 Importación y exportación de datos

Como ya se comentó en la Sección 1.8.1 podemos cargar y almacenar datos en ficheros (normalmente con extensión .RData o .rda) con las funciones load() y save() que emplean el formato por defecto de R (datos binarios comprimidos). Por ejemplo:

res <- load("datos/empleados.RData")
res # Devuelve el nombre de los objetos cargados en memoria
## [1] "empleados"

En estos casos hay que tener en cuenta que, aunque es lo habitual, el nombre del conjunto de datos puede no coincidir con el nombre del archivo, incluso puede contener varios objetos2.

# Guardar
save(empleados, file = "datos/empleados_new.RData")

Además R es capaz de importar datos externos en casi cualquier formato (aunque puede requerir instalar paquetes adicionales), entre ellos:

  • Archivos de texto (con distintos formatos).

  • Archivos en otros formatos: Excel, SPSS…

  • Bases de datos relacionales: MySQL, SQLite, PostgreSQL…

  • Formatos web: HTML, XML, JSON…

A continuación se muestran algunos ejemplos empleando código. Adicionalmente en RStudio se puede emplear los submenús en File > Import Dataset (se previsualizará el resultado y escribirá el código por nosotros).

4.1.1 Lectura de archivos de texto

En R para leer archivos de texto se suele utilizar la función read.table():

read.table(file, header = FALSE, sep = "", dec = ".", ...)  

Los principales argumentos son:

  • header: indica si el fichero tiene cabecera (header = TRUE) o no (header = FALSE). Por defecto toma el valor header = FALSE.

  • sep: carácter separador de columnas que por defecto es un espacio en blanco (sep = ""). Otras opciones serían: sep = ";" si el separador es un “;” sep = "\t" si el separador es una tabulación, etc.

  • dec: carácter utilizado en el fichero para los números decimales. Por defecto se establece dec = ".". Si los decimales vienen dados por “,” se utiliza dec = ","

Para más detalles y argumentos adicionales ver help(read.table).

Por ejemplo, supongamos que en el subdirectorio datos del directorio actual de trabajo está el fichero empleados.txt (con valores separados por espacios y con los los nombres de las columnas en la primera línea). Para leer este fichero y almacenarlo en un data.frame podemos emplear el siguiente código:

# Session > Set Working Directory > To Source...?
datos <- read.table(file = "datos/empleados.txt", header = TRUE)
# head(datos)
str(datos)
## 'data.frame':    474 obs. of  10 variables:
##  $ id      : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ sexo    : chr  "Hombre" "Hombre" "Mujer" "Mujer" ...
##  $ fechnac : chr  "2/3/1952" "5/23/1958" "7/26/1929" "4/15/1947" ...
##  $ educ    : int  15 16 12 8 15 15 15 12 15 12 ...
##  $ catlab  : chr  "Directivo" "Administrativo" "Administrativo" "Administrativo" ...
##  $ salario : num  57000 40200 21450 21900 45000 ...
##  $ salini  : int  27000 18750 12000 13200 21000 13500 18750 9750 12750 13500 ...
##  $ tiempemp: int  98 98 98 98 98 98 98 98 98 98 ...
##  $ expprev : int  144 36 381 190 138 67 114 0 115 244 ...
##  $ minoria : chr  "No" "No" "No" "No" ...

Si el fichero estuviese en el directorio c:\datos bastaría con especificar file = "c:/datos/empleados.txt".

Además están disponibles otras funciones con valores por defecto de los parámetros adecuados para otras situaciones. Por ejemplo, para ficheros separados por tabuladores se puede utilizar read.delim() o read.delim2() (ver también la Sección 4.1.3):

read.delim(file, header = TRUE, sep = "\t", dec = ".")
read.delim2(file, header = TRUE, sep = "\t", dec = ",")

Para leer archivos de texto en distintos formatos también se puede emplear el paquete readr (colección tidyverse), para lo que se recomienda consultar el Capítulo 11 del libro R for Data Science.

4.1.2 Importación desde SPSS

Podemos importar ficheros de datos en formato SPSS (extensión .sav) empleando la función read.spss() de la librería foreign. Por ejemplo:

library(foreign)
datos <- read.spss(file = "datos/Employee data.sav", to.data.frame = TRUE)
# head(datos)
str(datos)
## 'data.frame':    474 obs. of  10 variables:
##  $ id      : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ sexo    : Factor w/ 2 levels "Hombre","Mujer": 1 1 2 2 1 1 1 2 2 2 ...
##  $ fechnac : num  1.17e+10 1.19e+10 1.09e+10 1.15e+10 1.17e+10 ...
##  $ educ    : Factor w/ 10 levels "8","12","14",..: 4 5 2 1 4 4 4 2 4 2 ...
##  $ catlab  : Factor w/ 3 levels "Administrativo",..: 3 1 1 1 1 1 1 1 1 1 ...
##  $ salario : Factor w/ 221 levels "15750","15900",..: 179 137 28 31 150 101 121 31 71 45 ...
##  $ salini  : Factor w/ 90 levels "9000","9750",..: 60 42 13 21 48 23 42 2 18 23 ...
##  $ tiempemp: Factor w/ 36 levels "63","64","65",..: 36 36 36 36 36 36 36 36 36 36 ...
##  $ expprev : Factor w/ 208 levels "Ausente","10",..: 38 131 139 64 34 181 13 1 14 91 ...
##  $ minoria : Factor w/ 2 levels "No","Sí": 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "variable.labels")= Named chr [1:10] "Código de empleado" "Sexo" "Fecha de nacimiento" "Nivel educativo" ...
##   ..- attr(*, "names")= chr [1:10] "id" "sexo" "fechnac" "educ" ...
##  - attr(*, "codepage")= int 1252

También se puede emplear la función spss.get() del paquete Hmisc, lo cual puede ser recomendable si alguna de las variables contiene fechas.

4.1.3 Importación desde Excel

Se pueden leer fichero de Excel (con extensión .xlsx) utilizando por ejemplo los paquetes openxlsx, readxl (colección tidyverse), XLConnect o RODBC (este paquete se empleará más adelante para acceder a bases de datos), entre otros.

Sin embargo, un procedimiento sencillo consiste en exportar los datos desde Excel a un archivo de texto separado por tabuladores (extensión .csv). Por ejemplo, supongamos que queremos leer el fichero coches.xls:

  • Desde Excel se selecciona el menú Archivo -> Guardar como -> Guardar como y en Tipo se escoge la opción de archivo CSV. De esta forma se guardarán los datos en el archivo coches.csv.

  • El fichero coches.csv es un fichero de texto plano (se puede editar con Notepad), con cabecera, las columnas separadas por “;” y siendo “,” el carácter decimal.

  • Por lo tanto, la lectura de este fichero se puede hacer con:

    datos <- read.table("coches.csv", header = TRUE, sep = ";", dec = ",")

Otra posibilidad es utilizar la función read.csv2, que es una adaptación de la función general read.table con las siguientes opciones:

read.csv2(file, header = TRUE, sep = ";", dec = ",")

Por lo tanto, la lectura del fichero coches.csv se puede hacer de modo más directo con:

datos <- read.csv2("coches.csv")

4.1.4 Exportación de datos

Puede ser de interés la exportación de datos para que puedan leídos con otros programas. Para ello, se puede emplear la función write.table(). Esta función es similar, pero operando en sentido inverso, a read.table() (Sección 4.1.1).

Veamos un ejemplo:

tipo <- c("A", "B", "C")
longitud <- c(120.34, 99.45, 115.67)
datos <- data.frame(tipo, longitud)
datos
##   tipo longitud
## 1    A   120.34
## 2    B    99.45
## 3    C   115.67

Para guardar el data.frame datos en un fichero de texto se puede utilizar:

write.table(datos, file = "datos.txt")

Otra posibilidad es utilizar la función:

write.csv2(datos, file = "datos.csv")

y se creará el fichero datos.csv que se puede abrir directamente con Excel.


  1. Para almacenar un único objeto de forma que se pueda cargar posteriormente especificando el nombre, se pueden emplear las funciones saveRDS() y readRDS().↩︎