Anexo B Importación de archivos de Excel


Puesto que, para muchos usuarios, Excel es el contenedor de información por excelencia, el primer paso de casi cualquier análisis consiste en la importación de los datos desde Excel hacia R. Si bien es cierto que podrían generarse archivos intermedios de texto o archivos csv, cuya importación es relativamente sencilla30, esta estrategia es poco práctica, siendo deseable importar directamente desde el archivo Excel, sin necesidad de generar archivos intermedios. A continuación se presentan dos funciones, contenidas en diferentes paquetes, que permiten alcanzar este objetivo:

read_excel{readxl}
read.xlsx{openxlsx}

La manera en la que se usa cualquiera de estas dos funciones es similar: tras cargar el paquete contenedor de la función, se invoca la función, usando como argumento principal el nombre del archivo Excel, entre comillas, sin omitir su correspondiente extensión (xls o xlsx). El resultado de dicha función se asigna a un objeto.

Hay tres aspectos que vale la pena considerar, cuando se importan datos desde Excel:

  1. La integridad.
  2. La clase del objeto resultante.
  3. Los nombres de las columnas.

La integridad se refiere a que el proceso transfiera al objeto resultante toda la información contenida en las celdas del archivo Excel. En particular, es fundamental que se conserve toda la información de los decimales, independientemente de que —por cuestiones estéticas— algunos de los decimales pudieran estar ocultos en el archivo Excel. Lógicamente, se trata de una característica esencial.

Considérese la siguiente información tomada del archivo Excel Anexo-B.xlsx.

Las cuatro columnas de esta base de datos contienen exactamente la misma información. No obstante, la primera columna se está visualizando con 8 posiciones decimales; la segunda, con 2; la tercera, con una, y en la cuarta se han omitido todas las cifras decimales. A pesar de esta visualización diferenciada, la información interna contenida en cada fila es exactamente la misma. Así, si se multiplica el ‘1’ que aparece en la celda D3 por 10, el resultado será 5.0405812.

A continuación se ilustra el proceso de importación mediante las dos funciones presentadas anteriormente:

library(readxl)
data1 <- read_excel("Anexo-B.xlsx")

El objeto importado tiene el siguiente aspecto:

Tal y como se observa, el proceso de importación recuperó toda la información contenida en el archivo original, sin verse afectado por el hecho de que cada columna estuviera visualizándose de diferente manera.

library(openxlsx)
data2 <- read.xlsx("Anexo-B.xlsx")

Se obtiene un objeto con iguales características que el generado al importar mediante la función read_excel.

La función read.xls{gdata} —que hemos evitado presentar— no importa íntegramente la información cuando se parte de un archivo Excel en el que se haya elegido una opción de visualización con decimales reducidos. Este comportamiento puede ocasionar que el usuario pierda información inadvertidamente. Por tal motivo, se desaconseja enfáticamente su uso.

Teniendo presente que tanto read_excel{readxl} como read.xlsx{openxlsx} respetan lo concerniente a la integridad de la información al importar, veamos los otros dos aspectos: clase del objeto resultante y nombres de las columnas.

Clase de los objetos importados

Dependiendo de la función que se utilice, los objetos generados mediante el proceso de importación pueden ser de las clases tbl_df, tbl y/o data.frame.

Los objetos de la clase data.frame son utilizados en muchas funciones. Las otras dos clases constituyen variaciones del data frame, que combinan las características de estos con las de las tablas, dando lugar a tibbles31. Estas clases, aunque sean más estéticas, pueden generar conflictos y errores en algunas funciones tradicionales.

Nombre de las variables en los objetos importados

Las funciones tradicionales exigen nombres de las variables sintácticamente válidos, es decir, que no tengan espacios ni caracteres especiales (cf. capítulo 12). Aunque esto puede superarse encerrando el nombre entre tildes graves (`log (Crecimiento [UFC])`), esta opción no deja de ser incómoda, siendo más práctico adecuar todos los nombres a los estándares desde el momento de la importación, independientemente de cómo estén escritos en el archivo original de Excel.

Para ilustrar las características de los objetos resultantes, al usar read_excel{readxl} y read.xlsx{openxlsx}, considérese la siguiente información, contenida en la segunda hoja del archivo Anexo-B.xlsx.

Importación usando la función read_excel{readxl}

Esta es la función que se utiliza internamente cuando se abre el asistente de importación de RStudio (Import Dataset > From Excel…). No obstante, también puede usarse de manera directa escribiendo las correspondientes instrucciones.

Los objetos importados por esta vía son multiclase. Los nombres —aunque son estéticos— no se adecúan a los requerimientos de nombres de variables exigidos por muchas funciones.

El proceso de importación se realiza mediante las siguientes instrucciones:

library(readxl)
data3 <- read_excel("Anexo-B.xlsx", sheet = 2)

Verifiquemos la clase del objeto importado:

class(data3)
#> [1] "tbl_df"     "tbl"        "data.frame"

Tal y como se mencionó anteriormente, los objetos multiclase —como los que se generan al importar mediante la función read_excel— pueden generar conflicto en algunas funciones.

Asimismo, puede observarse que los nombres de las columnas no se ajustan a los requerimientos de nombres de variables de otras funciones, por contener espacios y caracteres especiales.

names(data3)
#> [1] "Temperatura °C"          "log (Crecimiento [UFC])"

No obstante, los anteriores problemas pueden superarse, convirtiendo el objeto importado en un data frame, lo cual puede hacerse en la misma instrucción de importación:

library(readxl)
data3.1 <- data.frame(read_excel("Anexo-B.xlsx", sheet = 2))
class(data3.1)
#> [1] "data.frame"
names(data3.1)
#> [1] "Temperatura..C"          "log..Crecimiento..UFC.."

Importación usando la función read.xlsx{openxlsx}

Lo primero que debe anotarse es que esta función únicamente importa archivos creados con versiones de Excel 2007 y posteriores (xlsx). Para importar archivos creados con versiones anteriores a Excel 2007 (xls), sería necesario actualizarlos previamente. Esta, desde luego, es una limitación menor, si se tiene en cuenta que en la actualidad la mayoría de bases de datos de Excel están en versión xlsx.

Los objetos importados mediante esta función son adecuados en clase (únicamente data.frame). Los nombres, por su parte, pueden adecuarse, usando el argumento check.names = TRUE (que puede escribirse abreviadamente como ch = T).

library(openxlsx)
data4 <- read.xlsx("Anexo-B.xlsx", sheet = 2, ch = T)
class(data4)
#> [1] "data.frame"
names(data4)
#> [1] "Temperatura..C"          "log..Crecimiento..UFC.."

Resumen y Recomendaciones

Aunque la importación desde archivos de texto y csv es relativamente directa, esta opción se considera poco práctica, puesto que, en muchas ocasiones, los usuarios tienen su información en archivos Excel, lo que implicaría además del proceso de exportación al formato texto o csv, la consiguiente acumulación de archivos. Lo inconveniente de esta situación se hace particularmente notorio cuando se requieren adecuaciones sobre la marcha, lo que implicaría modificar el archivo Excel, volver a realizar la exportación hacia un archivo intermedio de texto o csv y volver a importar dicho archivo. Consecuentemente, se recomienda realizar la importación directamente desde el archivo Excel, siempre que la información original esté contenida en un archivo de ese tipo.

Anticipándose a los requerimientos de las funciones de R, se recomienda no usar nombres con espacios ni caracteres especiales al momento de construir las bases de datos originales. Desde luego, el usuario podrá editar posteriormente los resultados generados por R para hacerlos más informativos y/o estéticos.

Para fines de máxima compatibilidad, se recomienda usar una opción de importación que genere objetos que satisfagan los requerimientos tanto de clase como de nombres de variables de muchas de las funciones clásicas de R. Cualquiera de las dos instrucciones que se listan a continuación da lugar a objetos con tales características:

library(readxl)
data <- data.frame(read_excel("Anexo-B.xlsx"))
library(openxlsx)
data <- read.xlsx("Anexo-B.xlsx", ch = T)