4.1 Lectura, importación y exportación de datos

Además de la introducción directa, R es capaz de importar datos externos en múltiples formatos:

  • bases de datos disponibles en librerías de R

  • archivos de texto en formato ASCII

  • archivos en otros formatos: Excel, SPSS, …

  • bases de datos relacionales: MySQL, Oracle, …

  • formatos web: HTML, XML, JSON, …

  • ….

4.1.1 Formato de datos de R

El formato de archivo en el que habitualmente se almacena objetos (datos) R es binario y está comprimido (en formato "gzip" por defecto). Para cargar un fichero de datos se emplea normalmente load():

res <- load("datos/empleados.RData")
res
## [1] "empleados"
ls()
##  [1] "cite_fsimres" "cite_simres"  "citefig"      "citefig2"     "citepkg"     
##  [6] "empleados"    "fig.path"     "inline"       "inline2"      "is_html"     
## [11] "is_latex"     "latexfig"     "res"

y para guardar save():

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

El objeto empleado normalmente en R para almacenar datos en memoria es el data.frame.

4.1.2 Acceso a datos en paquetes

R dispone de múltiples conjuntos de datos en distintos paquetes, especialmente en el paquete datasets que se carga por defecto al abrir R. Con el comando data() podemos obtener un listado de las bases de datos disponibles.

Para cargar una base de datos concreta se utiliza el comando data(nombre) (aunque en algunos casos se cargan automáticamente al emplearlos). Por ejemplo, data(cars) carga la base de datos llamada cars en el entorno de trabajo (".GlobalEnv") y ?cars muestra la ayuda correspondiente con la descripición de la base de datos.

4.1.3 Lectura de archivos de texto

En R para leer archivos de texto se suele utilizar la función read.table(). Supóngase, por ejemplo, que en el directorio actual está el fichero empleados.txt. La lectura de este fichero vendría dada por el 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". Nótese también que para la lectura del fichero anterior se ha establecido el argumento header=TRUE para indicar que la primera línea del fichero contiene los nombres de las variables.

Los argumentos utilizados habitualmente para esta función 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="*" si el separador es un “*,” 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 = ","

Resumiendo, los (principales) argumentos por defecto de la función read.table son los que se muestran en la siguiente línea:

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

Para más detalles sobre esta función véase help(read.table).

Estan 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():

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

4.1.4 Alternativa tidyverse

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.5 Importación desde SPSS

El programa R permite lectura de ficheros de datos en formato SPSS (extensión .sav) sin necesidad de tener instalado dicho programa en el ordenador. Para ello se necesita:

  • cargar la librería foreign

  • utilizar la función read.spss

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

Nota: Si hay fechas, puede ser recomendable emplear la función spss.get() del paquete Hmisc.

4.1.6 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.7 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 funcionando en sentido inverso, a read.table() (Sección 4.1.3).

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

que dará lugar al fichero datos.csv importable directamente desde Excel.