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.
## [1] "empleados"
## [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()
:
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" ...
## [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 valorheader=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 establecedec = "."
. Si los decimales vienen dados por “,” se utilizadec = ","
.
Resumiendo, los (principales) argumentos por defecto de la función
read.table
son los que se muestran en la siguiente línea:
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()
:
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:
## [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):
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
:
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 enTipo
, 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:
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:
Por lo tanto, la lectura del fichero coches.csv se puede hacer de modo más directo con:
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:
Otra posibilidad es utilizar la función:
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).
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.