6 LECTURA DE DATOS

Existen muchas formas de leer datos en R: ingresándolos directamente a través de la consola (o de un script), leyéndolos desde un archivo en formato nativo que haya sido guardado previamente o importándolos desde otro formato.

La primera forma, es decir, ingresándolos directamente a través de la consola es muy poco práctica, por lo que no suele usarse más que en casos sencillos, donde se tengan pocos datos o se esté usando R como calculadora en el modo interactivo. La segunda manera implica haber creado la base de datos en formato nativo en una sesión previa (probablemente, vía importación). La tercera forma, es decir, la que procede por importación, es la más usual y es la que se detalla a continuación.

Las funciones más comunes para importar datos son read.table, read.csv y read_excel. La función read.table lee datos en formato ascii, la función read.csv lee datos almacenados en formato csv (comma separated values), mientras que la función read_excel importa desde un archivo de Excel (formato xls o xlsx).

Cualquiera de las anteriores funciones tiene como primer argumento el nombre del archivo que se importa, el cual se escribe encerrado entre comillas, ya sean sencillas o dobles, incluyendo su extensión.

Si el archivo que se desea importar no se encuentra en el directorio de trabajo (cf. capítulo 3), es necesario incluir la ruta completa en la instrucción de importación. Puede usarse una ruta local (una ubicación en el equipo del usuario) o un URL (uniform resource locator).

La instrucción para leer una base de datos en formato ascii, ubicada en una ruta local particular (cf. capítulo 3), podría tener el siguiente aspecto:

bd <- read.table("C:/BDR/datos.txt")

Mediante la instrucción anterior se lee la información contenida en el archivo ascii llamado datos.txt, ubicado en el directorio BDR, que está en la raíz del disco C, y se asigna a un objeto llamado bd.

De manera enfática, se desaconseja incluir rutas locales en los scripts. Esto les resta compatibilidad interusuarios, pudiendo generarle dificultades incluso a un mismo usuario si la ruta fuera cambiada. Supóngase que un script que contenga la instrucción anterior es compartido con otro usuario, quien al intentar ejecutarlo probablemente recibirá un mensaje de error, pues sería bastante improbable que el nuevo usuario ubicara la base de datos en una ruta local que tuviera exactamente el mismo nombre ("C:/BDR/"). Asimismo, el usuario original tendría problemas si realizara cualquier modificación a la ruta local, manteniendo inalterado el script. Así, por ejemplo, si los datos se movieran a la unidad D, la base de datos dejaría de ser ubicable mediante la instrucción anterior. Para evitar estos problemas, lo más recomendable es escribir únicamente el nombre del archivo de origen, dejando que el directorio de trabajo se defina automáticamente al momento de llamar el script (cf. capítulo 3)15.

Los elementos dentro de los archivos ascii pueden estar separados por espacios (uno o más), por tabuladores o por una combinación de ambos, sin que tenga que satisfacerse ninguna condición de alineación. El formato con separadores tabulares es más general, puesto que permite incorporar cadenas de texto que incluyan espacios.

Si la primera fila no contiene los nombres de las variables, R las nombrará automáticamente de manera genérica como V1, V2, . . . , VK, siendo K el número de variables. Si la primera fila contiene el nombre de la variable, deberá indicarse explícitamente, con el argumento header = TRUE. Si el nombre de la variable contiene espacios o caracteres especiales, estos serán remplazados por puntos. La instrucción para leer un archivo con valores separados por tabuladores y con los nombres de las variables en la primera fila, tendrá el siguiente aspecto:

bd <- read.table("datos.txt", sep = "\t", header = TRUE)

La función read.delim trae por defecto las opciones de separador tabular y encabezado, por lo que la importación ilustrada podría realizarse así:

bd <- read.delim("datos.txt")

La función read.csv realiza en esencia la misma labor que read.table o que read.delim, pero sobre un archivo csv, cambiando los valores por defecto. Al usar la función read.csv, la primera fila del archivo se toma como encabezado y la coma es el separador de los elementos.

Para leer información directamente desde un archivo Excel, se usa la función read_excel, que forma parte del paquete readxl.

Esta función tiene la siguiente sintaxis:

bd <- read_excel("datos.xlsx", sheet = 1)

Por defecto, se lee la primera hoja. Por tanto, si los datos que se van a importar están ubicados en la primera hoja, podrá omitirse el segundo argumento. Si se desea leer una hoja diferente a la primera, puede usarse el número correspondiente a la posición de la hoja o el nombre.

En adición a las anteriores funciones, también pueden usarse read.delim2 y read.csv2, las cuales difieren de sus funciones cuasihomónimas en reconocer por defecto la coma (,) como carácter decimal. En tal caso, los archivos csv usan el punto y coma (;) como separador de valores.

Cualquiera de las funciones anteriores puede usarse conjuntamente con la función file.choose, para importar un archivo que se encuentre en una ubicación cualquiera, sin necesidad de escribir su nombre, sino ubicándolo mediante una ventana de navegación. Si se desea leer, por ejemplo, un archivo ascii con nombres de variables en la primera fila, separador tabular para los elementos y punto como carácter decimal, pude usarse la siguiente instrucción:

bd <- read.delim(file.choose())

Obsérvese que, más allá de la aparente diversidad de métodos para importación de datos a partir de archivos externos, en esencia se tienen funciones para leer información desde formatos ascii y Excel (xls o xlsx), dado que los archivos csv son en realidad archivos de texto en los que se usa otro separador de valores.

Con excepción de la función read_excel, que forma parte del paquete readxl, las demás funciones reseñadas forman parte del paquete utils, que es uno de los que se carga cada vez que se inicia una sesión de trabajo en R, no siendo necesario, por tanto, invocar el correspondiente paquete.

Las funciones de importación que están incluidas en el paquete utils difieren únicamente en los valores que traen por defecto para sus argumentos, siendo posible usar cualquiera de ellas con argumentos especificados por el usuario, que se adecúen a las características del archivo que se va a leer. A continuación, se resumen las funciones mencionadas, con los valores por defecto para sus principales argumentos.

Función Formato Nombre de variables en la primera fila (header) Separador de elementos (sep) Carácter decimal (dec)
read.table ascii FALSE "" "."
read.delim ascii TRUE "\t" "."
read.delim2 ascii TRUE "\t" ","
read.csv csv TRUE "," "."
read.csv2 csv TRUE ";" ","
read_excel xls o xlsx TRUE El del sistema

En el Anexo B se presentan otras funciones para importación directa de datos desde archivos Excel, detallando las características de los objetos resultantes.

En adición a la lectura desde un archivo en una localización específica o en una ubicación cualquiera (mediante la función file.choose), es posible leer información directamente desde el portapapeles (clipboard); basta con usar cualquiera de las funciones expuestas anteriormente, excepto read_excel, introduciendo "clipboard" como primer argumento de la función y realizando las especificaciones del caso en los demás argumentos, de ser necesario.

Es importante aclarar que el hecho de que la función read_excel no pueda usarse para leer información desde el portapapeles, no impide que puedan importarse datos contenidos en un archivo Excel, mediante esta estrategia. De hecho, La situación más común surge cuando se copian datos desde Excel al portapapeles (usando Ctrl + C en Windows). Los valores en el portapapeles quedan separados por tabuladores. Suponiendo que en el área seleccionada y copiada se hubieran incluido los encabezados de cada columna, podría importarse dicha información en R así:

bd <- read.delim("clipboard")

Si en la región seleccionada y copiada no se incluyen encabezados, podría usarse la siguiente instrucción:

bd <- read.table("clipboard", sep = "\t")

o

bd <- read.delim("clipboard", header = FALSE)

Si la región seleccionada y copiada incluyó encabezados, pero el separador decimal del sistema es la coma, podría usarse la siguiente instrucción:

bd <- read.delim2("clipboard")

En resumen, para la importación de datos se utiliza alguna de las funciones descritas anteriormente, bien sea indicando el nombre del archivo que contiene la información o mediante la opción de búsqueda del archivo (file.choose) o de copiado desde el portapapeles (clipboard). A no ser que la labor vaya a realizarse una única vez, sin que vuelva a requerirse nunca su ejecución, se desaconseja el uso de las opciones file.choose y clipboard, por no facilitar el uso posterior del script. Con miras a la trazabilidad y posibilidad de edición y reejecución de los scripts, se aconseja explicitar siempre el nombre del archivo que contiene los datos que se importan.

La rapidez y eficiencia del proceso de importación depende del tamaño de las bases de datos, pudiendo ser prácticamente instantáneo o tardar mucho tiempo. Cuando se trabaja con bases de datos muy grandes, puede resultar más práctico tener la base de datos en formato nativo que realizar la importación cada vez que se retome el script. Puesto que los datos usualmente provienen de una fuente externa (v. gr. un archivo de Excel o de texto), aun en este caso será inevitable realizar una importación inicial. No obstante, cuando vuelva a ejecutarse el script, los datos podrán leerse directamente desde el formato nativo, haciendo más rápido el proceso.

Para guardar una base de datos en formato nativo se usa la función save, con el nombre del objeto importado como primer argumento y el nombre del archivo de datos como segundo argumento. Supóngase, por ejemplo, que usando la función read_excel, se importa una base de datos desde Excel, quedando en el ambiente de trabajo como bd:

bd <- read_excel("datos.xlsx", sheet = 1)

Si a futuro se quiere usar nuevamente los datos contenidos en bd, sin necesidad de importarlos nuevamente desde Excel, se guardan físicamente como un archivo de datos en formato nativo de R, usando la función save, así:

save(bd, file = "bd.RData")

La anterior instrucción genera el archivo bd.RData, el cual contiene la información en el formato nativo de R. Este archivo puede leerse a futuro, de manera rápida, usando la instrucción load.

load("bd.RData")

La función load carga en el ambiente de trabajo el contenido de bd.RData, esto es, el data frame bd.