2.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, Matlab…

  • bases de datos relacionales: MySQL, Oracle…

  • formatos web: HTML, XML, JSON…

  • otros lenguajes de programación: Python, Julia…

2.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(). A continuación se utiliza el fichero empleados.RData que contiene datos de empleados de un banco.

res <- load("data/empleados.RData")
res
## [1] "empleados"
ls()
##  [1] "cite_cran" "cite_fig"  "cite_fig2" "cite_fun" 
##  [5] "cite_fun_" "cite_pkg"  "cite_pkg_" "citefig"  
##  [9] "citefig2"  "empleados" "fig.path"  "inline"   
## [13] "inline2"   "is_html"   "is_latex"  "latexfig" 
## [17] "latexfig2" "res"

y para guardar save():

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

Aunque, como indica este comando en la ayuda (?save):

For saving single R objects, saveRDS() is mostly preferable to save(), notably because of the functional nature of readRDS(), as opposed to load().

saveRDS(empleados, file = "data/empleados_new.rds")
## restore it under a different name
empleados2 <- readRDS("data/empleados_new.rds")
# identical(empleados, empleados2)

Normalmente, el objeto empleado en R para almacenar datos en memoria es el data.frame.

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

2.1.3 Lectura de archivos de texto

En R, para leer archivos de texto se suele utilizar la función read.table(). Suponinedo, 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 = "data/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" ...
class(datos)
## [1] "data.frame"

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

2.1.4 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 = "data/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.

2.1.5 Importación desde Excel

Se pueden leer fichero de Excel (con extensión .xlsx) utilizando, por ejemplo, los paquetes:

library(openxlsx)
datos<-read.xlsx("./data/coches.xlsx")
class(datos)
## [1] "data.frame"
  • RODBC (este paquete se empleará más adelante para acceder a bases de datos), entre otros.

El siguiente código implementa una función que permite leer todos los archivos en formato .xlsx en un directorio:

library(openxlsx)
read_xlsx <- function(path = '.') {
  files <- dir(path, pattern = '*.xlsx') # list.files
  # file.list <- lapply(files, readWorkbook)
  file.list <- vector(length(files), mode = 'list')
  for (i in seq_along(files)) 
      file.list[[i]] <- readWorkbook(files[i])
  file.names <- sub('\\.xlsx$', '', basename(files)) 
  names(file.list) <- file.names
  file.list
}

Para combinar los archivos, suponiendo que tienen las mismas columnas, podríamos ejecutar una llamada a rbind()(R base):

df <- do.call('rbind', file.list)

o emplear la función bind_rows() del paquete dplyr, donde las columnas se emparejan por nombre, y cualquier columna que falte se rellenará con NA:

df <- dplyr::bind_rows(file.list)

El Capítulo 4, provee de otras utilidades para la manipulación de datos con dplyr (Wickham et al. 2023).

Los datos cargados en R (usualmente un data.frame) se pueden exportar desde Excel fácilmente a un archivo de texto separado por comas (extensión .csv), evitando utilizar algunos de los paquetes mencionados anteriormente. 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 el bloc de notas, 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. Esta función no es más que 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")

Esta forma de proceder, exportando a formato CSV, se puede emplear con otras hojas de cálculo o fuentes de datos. Hay que tener en cuenta que si estas fuentes emplean el formato anglosajón, el separador de campos será sep = "," y el de decimales dec = ".", las opciones por defecto en la función read.csv().

2.1.6 Exportación de datos

Puede ser de interés la exportacifn de datos para que puedan ser 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(), ver Sección 2.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. Las opciones anteriores sólo dependen del paquete utils, que se instala por defecto con R base.

2.1.7 Python, Julia y otros lenguajes de programación

R es un lenguaje de programación libre (derivado del lenguaje S en los Laboratorios Bell) que se caracteriza por su capacidad para interactuar con otros lenguajes de programación, incluyendo Python (Van Rossum and Drake Jr 1995) y Julia (Bezanson et al. 2017).

En el ámbito de la Estadística (como en la denominada Ciendica de Datos), R destaca por su extensa y detallada documentación (en muchos casos como resultado de aportaciones metodológicas y/o avances científicos). Por ejemplo, después de diez años de la primera edición del libro An Introduction to Statistical Learning con aplicaciones en R (ISLR) , James et al. (2013), algunos de los mismos autores publicaron la edición en Python (ISLP), James et al. (2023).
Por otro lado, en 2015, se lanzó el paquete reticulate disponible en https://rstudio.github.io/reticulate/, permitiendo la ejecución de código Python desde R (y en 2020 se completó la integración de Python en la interfaz de RStudio).

library(reticulate)
os <- import("os")
os$listdir(".")

Si queremos trabajar con Python de forma interactiva, podemos usar repl_python(). Los objetos creados en Python se pueden usar en R con py de reticulate.

Recientemente, Julia se presenta también como una alternativa a considerar. El paquete JuliaConnectoR disponible en https://cran.r-project.org/web/packages/JuliaConnectoR/ facilita la importación de funciones y paquetes completos de Julia a R, es decir, permite el uso de funciones de Julia directamente en R.

R también permite el uso/comunicación de otros lenguajes de programación como Java, C, C++, Fortran, entre otros.

References

Bezanson, Jeff, Alan Edelman, Stefan Karpinski, and Viral B Shah. 2017. “Julia: A Fresh Approach to Numerical Computing.” SIAM Review 59 (1): 65–98. https://doi.org/10.1137/141000671.
James, Gareth, Daniela Witten, Trevor Hastie, Robert Tibshirani, et al. 2013. An Introduction to Statistical Learning. Vol. 112. Springer.
James, Gareth, Daniela Witten, Trevor Hastie, Robert Tibshirani, and Jonathan Taylor. 2023. An Introduction to Statistical Learning: With Applications in Python. Springer Nature.
Van Rossum, Guido, and Fred L Drake Jr. 1995. Python Reference Manual. Centrum voor Wiskunde en Informatica Amsterdam.
Wickham, Hadley, Romain François, Lionel Henry, Kirill Müller, and Davis Vaughan. 2023. Dplyr: A Grammar of Data Manipulation. https://dplyr.tidyverse.org.