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, …
bases de datos relacionales: MySQL, Oracle, …
formatos web: HTML, XML, JSON, …
….
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()
:
## [1] "empleados"
## [1] "citefig" "citefig2" "empleados" "fig.path" "inline" "inline2"
## [7] "is_html" "is_latex" "latexfig" "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)
El objeto empleado normalmente 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()
.
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 = "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" ...
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 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.
2.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 = "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.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.
Por ejemplo 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()
o emplear la función bind_rows()
del paquete dplyr
:
Como alternativa simple se pueden exportar los datos desde Excel a un archivo de texto separado por comas (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 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 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
, que es
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.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 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.