8 Importar y exportar datos

8.1 Leer datos de un archivo

8.1.1 Transformar datos en formato TXT o CSV

Hay muchas maneras de leer el contenido de un archivo con R. Sin embargo, nos enfocaremos en leer los archivos TXT y CSV que son los más comunes y los más confiables. Con raras excepciones, todos los archivos de datos se pueden transformar fácilmente en formatos TXT y CSV. Esta es la práctica preferida para el análisis de datos con R.

En concreto, desde Microsoft Excel, simplemente vamos a Archivo, luego Guardar como, seleccionamos el lugar donde queremos guardar nuestro archivo (hablaremos en el siguiente capítulo sobre la gestión de un proyecto R) y luego en el la ventana de copia de seguridad cambiamos el Tipo desde XLSX hacia CSV. Desde LibreOffice Calc, simplemente vamos a Archivo, luego Guardar como, luego seleccionamos el tipo CSV. Es importante saber que el archivo CSV no admite el formato de archivos de hoja de cálculo con, por ejemplo, colores, y que el archivo CSV contiene solo una pestaña. Si tenemos un archivo de hoja de cálculo con varias pestañas, tendremos que guardar tantos archivos CSV como pestañas.

CSV viene del Inglés Comma-separated values (https://es.wikipedia.org/wiki/Valores_separados_por_comas) y representa los datos de hoja de cálculo en un formato de texto separado por comas (o punto y coma según el país). Siempre se puede abrir un archivo CSV con software de hoja de cálculo, pero también con un editor de texto simple como el bloc de notas de Windows o con Notepad++. Es preferible abrir archivos CSV con un editor de texto porque las hojas de cálculo tienden a querer cambiar automáticamente los archivos CSV y esto tiene el efecto de dificultar su lectura.

Una vez que se obtiene el archivo TXT o CSV, la lectura del contenido desde R es fácil, aun que requiere un poco de rigor.

8.1.2 Leer un archivo CSV

Esta es la fuente de error más común para los principiantes en R. Es por eso que es importante leer y volver a leer este capítulo y lo siguiente sobre la gestión de un proyecto R con mucha atención.

R funciona en un directorio definido por defecto. Los usuarios de Rstudio u otro entorno de desarrollo especializado para R intentarán usar las opciones disponibles a través de los menús para establecer su directorio de trabajo o cargar el contenido de un archivo. En este libro, estas técnicas nunca se usarán porque no permiten la reproducibilidad de los resultados. Un script debe poder funcionar para todos los sistemas operativos y sin tener en cuenta el entorno de desarrollo del usuario.

El directorio de trabajo por defecto se puede obtener con la función getwd() y cambiar con la función setwd().

oldWd <- getwd()
print(oldWd)
## [1] "D:/GitHub/myRbook_SP"
setwd("..")
getwd()
## [1] "D:/GitHub"
setwd(oldWd)
getwd()
## [1] "D:/GitHub/myRbook_SP"

Entonces tenemos cuatro opciones:

  • podemos leer el contenido de un archivo indicando a R su ruta completa (limitacion para la reproducibilidad de los resultados)
  • podemos leer el contenido de un archivo indicando a R su ruta relativa
  • podemos mover el archivo en el directorio de trabajo de R
  • podemos modificar el directorio de trabajo de R para que coincida con la ubicación de nuestro archivo (con su ruta relativa)

Un ejemplo de una ruta completa sería:

  • /home/myName/myFile.csv en un entorno UNIX
  • C:/users/myName/myFile.csv bajo un entorno de Windows (tenga cuidado, bajo R utilizamos / y no \ como es el caso por defecto en Windows)

Un camino relativo sería:

  • myName/myFiles.csv

Para navegar por las rutas relativas, podemos usar .. que permite volver al directorio de origen. Por ejemplo, si el directorio de trabajo es myScripts y el árbol de mis archivos es:

## -myProject
## |-myFiles
## |-|-data01.csv
## |-|-data02.csv
## |-myScripts
## |-|-myFirstScript.R

La ruta relativa al archivo data01.csv sería ../myFiles/data01.csv

Entonces, para leer el contenido del archivo data01.csv, privilegiaremos la opción 2 (leer el contenido de un archivo que indicando su ruta relativa) o la opción 4 (modificar el directorio de trabajo de R para que coincida con la ubicación de nuestro archivo). En el último caso:

myWD <- "../myFiles/"
setwd(myWd)
getwd() # para verificar que estamos en el directorio correcto
list.files() # para verificar que el archivo está aquí

El error más común:

## Error in setwd("../myFiles/") : 
## no se puede cambiar el directorio de trabajo

Esto significa que el directorio no existe (se debe verificar que la sintaxis sea correcta y que el directorio exista con esta ruta).

Una vez que el directorio de trabajo está definido correctamente o la ruta relativa al archivo está establecida correctamente, podemos leer el archivo con la función read.table(). Algunos usan la función read.csv() pero este es solo un caso especial de read.table().

myWD <- "../myFiles/"
setwd(myWd)
read.table(file = "data01.csv")

o alternativamente:

read.table(file = "../myFiles/data01.csv")

Si la ruta no se llena correctamente o si el archivo de datos no existe, R devolverá el siguiente error:

## Error in file(file, "rt") : incapaz de abrir la conexión
## De más : Warning message:
## In file(file, "rt") :
##   incapaz de abrir el archivo '../myFiles/data01.csv' : No such file or directory

Si todo está bien, R muestra el contenido del archivo data01.csv. Advertencia a los usuarios de Windows porque por defecto no aparece la extensión de los archivos… Así que cuando navegamos a través de directorios con el explorador de archivos, no hay data01.csv, pero sólo un archivo data01. Es esencial remediar este problema para evitar errores. Para hacer esto, simplemente abrimos las ‘Opciones del Explorador de archivos’ a través de la tecla ‘Windows’, luego en la pestaña ‘Ver’, verificamos que la opción ‘Ocultar extensiones de archivos cuyo tipo es conocido’ no está marcado.

Consultando la ayuda sobre la función read.table(), podemos ver que tiene muchos argumentos. Los principales son:

  • header = FALSE: ¿el archivo contiene nombres de columna? Si es así, cambiamos el valor a header = TRUE
  • sep =" ": ¿cómo se separan los datos de la tabla? En un archivo CSV es la coma o el punto y coma, así que cambiamos a sep = "," o sep = ";"
  • dec =". ": ¿cuál es el separador de los números decimales? Si es la coma, entonces debes cambiar a dec = ","

Con estos tres argumentos, la mayoría de los archivos se pueden leer sin ningún problema. En caso de necesidad, la ayuda de esta función es muy completa.

La función read.table () devuelve el contenido del archivo como data.frame. Para poder usar el contenido del archivo, almacenaremos el data.frame en un objeto.

myWD <- "../myFiles/"
setwd(myWd)
data01 <- read.table(file = "data01.csv")
str(data01) # verificar el formato de los datos
head(data01) # vverificar los primeros datos

El estudio de caso sobre el análisis de datos de datalogger se basa en un archivo CSV. Aquí hay un extracto:

bdd <- read.table("myFiles/E05C13.csv", skip = 1, header = TRUE, 
  sep = ",", dec = ".", stringsAsFactors = FALSE)
colnames(bdd) <- c("id", "date", "temp")
head(bdd)
##   id              date  temp
## 1  1 11/12/15 23:00:00 4.973
## 2  2 11/12/15 23:30:00 4.766
## 3  3 11/13/15 00:00:00 4.844
## 4  4 11/13/15 00:30:00 4.844
## 5  5 11/13/15 01:00:00 5.076
## 6  6 11/13/15 01:30:00 5.282
tail(bdd)
##          id              date  temp
## 32781 32781 09/25/17 21:00:00 7.091
## 32782 32782 09/25/17 21:30:00 6.914
## 32783 32783 09/25/17 22:00:00 6.813
## 32784 32784 09/25/17 22:30:00 6.611
## 32785 32785 09/25/17 23:00:00 6.331
## 32786 32786 09/25/17 23:30:00 5.385
str(bdd)
## 'data.frame':    32786 obs. of  3 variables:
##  $ id  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ date: chr  "11/12/15 23:00:00" "11/12/15 23:30:00" "11/13/15 00:00:00" "11/13/15 00:30:00" ...
##  $ temp: num  4.97 4.77 4.84 4.84 5.08 ...

8.1.3 Leer un archivo de texto

La función más simple para leer un archivo que contiene texto es readlines(). Aquí hay un ejemplo con el archivo README.md de este libro, que se encuentra en GitHub.

readmeGitHub <- "https://raw.githubusercontent.com/frareb/myRBook_SP/master/README.md"
readLines(readmeGitHub)
## [1] "# myRBook_SP"                                                                                                          
## [2] "Aqui se encuentra el código fuente del libro  *Aprender R: iniciación y perfeccionamiento*, construido con bookdown."

También está la función scan() que devolve todas las palabras separadas por espacios. Podemos consultar la ayuda para obtener más información.

scan(readmeGitHub, what = "character")
##  [1] "#"                   "myRBook_SP"          "Aqui"               
##  [4] "se"                  "encuentra"           "el"                 
##  [7] "código"             "fuente"              "del"                
## [10] "libro"               "*Aprender"           "R:"                 
## [13] "iniciación"         "y"                   "perfeccionamiento*,"
## [16] "construido"          "con"                 "bookdown."

8.2 Guardar datos para R

A veces es útil poder guardar un objeto R para poder reutilizarlo más tarde. Este es el caso, por ejemplo, cuando el tiempo de cálculo para llegar a un resultado es muy largo, o cuando queremos liberar espacio en la RAM. Para hacer esto, existe la función save() que toma como argumento principal el nombre de los objetos que queremos guardar.

El objeto guardado se almacenará en un archivo. Por convención, es bueno dar como nombre de extensión .RData a los archivos que contienen objetos R, preferir un solo objeto por archivo, y dar el nombre del objeto como nombre del archivo.

myObject <- 5
ls(pattern = "myObject")
## [1] "myObject"
save(myObject, file = "myFiles/myObject.RData")
rm(myObject)
ls(pattern = "myObject")
## character(0)

Si necesitamos el objeto guardado en el archivo, podemos volver a cargarlo con la función load().

ls(pattern = "myObject")
## character(0)
load("myFiles/myObject.RData")
ls(pattern = "myObject")
## [1] "myObject"
print(myObject)
## [1] 5

8.3 Exportar datos

La mejor forma de comunicar sus resultados o datos es enviar sus scripts y archivos de datos. A veces esto no es posible o no es adecuado, y puede ser útil exportar sus datos en un archivo de texto o CSV. Para hacer esto, existe la función genérica write() y la función write.table() para data.frame.

Por ejemplo, crearemos un data.frame con los números del 1 al 26 y las letras correspondientes, luego los guardaremos en un archivo CSV, luego volveremos a leer los datos contenidos en este archivo.

dfLetters <- data.frame(num = 1:26, letters = letters)
write.table(dfLetters, file = "myFiles/dfLetters.csv", 
  sep = ",", col.names = TRUE, row.names = FALSE)
read.table(file = "myFiles/dfLetters.csv", header = TRUE, sep = ",")
##    num letters
## 1    1       a
## 2    2       b
## 3    3       c
## 4    4       d
## 5    5       e
## 6    6       f
## 7    7       g
## 8    8       h
## 9    9       i
## 10  10       j
## 11  11       k
## 12  12       l
## 13  13       m
## 14  14       n
## 15  15       o
## 16  16       p
## 17  17       q
## 18  18       r
## 19  19       s
## 20  20       t
## 21  21       u
## 22  22       v
## 23  23       w
## 24  24       x
## 25  25       y
## 26  26       z

8.4 Conclusión

Felicitaciones! Ahora sabemos cómo leer datos de un archivo de texto o CSV, guardar y cargar datos de RData, y escribir en un archivo. El error más común entre los principiantes en R es la lectura de archivos de datos. Es por eso que este capítulo es para leer y volver a leer sin moderación.