Leer Excel en R

Manipulación de datos con R Importar y exportar datos
Leer hojas de Excel en R

Excel es una hoja de cálculo desarrollada por Microsoft, que permite administrar los datos de una manera muy simple. Hasta 2007, XLS era la extensión de archivo principal. Sin embargo, en la versión de 2007 se introdujo la extensión XLSX (basada en XML), para convertirse en el formato de libro de Excel predeterminado. En este tutorial aprenderás a leer un Excel en R y RStudio con varios paquetes.

¿Cómo importar archivos Excel en R?

Para trabajar con datos de Excel en R deberás usar un paquete desarrollado para tal fin. Hay varias opciones, pero los mejores paquetes para leer archivos de Excel podrían ser openxlsx y readxl, ya que no dependen de JAVA (a diferencia de los paquetes xlsx y XLConnect) ni de Perl (como el paquete gdata).

Ten en cuenta que las dependencias externas pueden causar errores al cargar los paquetes, pero para grandes conjuntos de datos deberían ser más rápidos que las otras alternativas.

Importar datos de Excel en RStudio desde el menú

Si estás usando RStudio puedes ir a FileImport DatasetFrom Excel…. Luego, selecciona tu archivo de Excel pulsando Browse… y personaliza la salida (el nombre de la variable, la hoja, el rango de celdas, …). También puedes ver una vista previa del código que se ejecutará de fondo y de los datos que se cargarán:

Importar archivo Excel en RStudio

Leer archivo Excel XLS, XLSX en RStudio con el menú

Ten en cuenta que para utilizar este procedimiento necesitas tener instalado el paquete readxl.

Leer XLSX sin JAVA en R: readxl y openxlsx

El paquete readxl

El paquete readxl forma parte del paquete tidyverse, creado por Hadley Wickham (científico jefe en RStudio) y su equipo. Este paquete soporta XLS a través de la librería de C libxls y archivos XLSX a través del paquete RapidXML de C++, sin la necesidad de utilizar dependencias externas.

El paquete proporciona algunos archivos Excel (XLS y XLSX) de muestra almacenados en la carpeta de instalación del paquete, por lo que con el objetivo de ofrecer un ejemplo reproducible, en los siguientes ejemplos vamos a utilizar el archivo clippy.xlsx, cuya primera hoja es la siguiente:

XLSX de ejemplo en R

Para cargar la ruta del archivo Excel de muestra, puedes utilizar la función readxl_example. Una vez cargado, o una vez que tengas la ruta de tu propio archivo Excel, puedes usar la función excel_sheets para obtener los nombres de las hojas del archivo Excel, en caso de que lo necesites.

# install.packages("readxl")
library(readxl)

# Obtener la ruta de un archivo XLSX de ejemplo del paquete
ruta_archivo <- readxl_example("clippy.xlsx")

# Comprobar los nombres de las hojas del archivo
excel_sheets(ruta_archivo) # "list-column" "two-row-header"

La función genérica del paquete para leer archivos de Excel en R es la función read_excel, que ‘adivina’ el tipo de archivo (XLS o XLSX) según la extensión del archivo y el archivo en sí, en ese orden.

read_excel(ruta_archivo)
# A tibble: 4 x 2
  name                 value    
  <chr>                <chr>    
1 Name                 Clippy   
2 Species              paperclip
3 Approx date of death 39083    
4 Weight in grams      0.9 

El argumento sheet permite especificar la hoja que quieres cargar, pasando su nombre o el número correspondiente de la pestaña. Ten en cuenta que, por defecto, la función carga la primera hoja de Excel.

# Seleccionamos la otra hoja del Excel
read_excel(ruta_archivo, sheet = "two-row-header")
read_excel(ruta_archivo, sheet = 2) # Equivalente
# A tibble: 2 x 4
  name       species              death                 weight    
  <chr>      <chr>                <chr>                 <chr>     
1 (at birth) (office supply type) (date is approximate) (in grams)
2 Clippy     paperclip            39083                 0.9 

También puedes saltar filas con el argumento skip de la función:

# Saltar la primera fila
read_excel(ruta_archivo, skip = 1)
# A tibble: 3 x 2
  Name                 Clippy   
  <chr>                <chr>    
1 Species              paperclip
2 Approx date of death 39083    
3 Weight in grams      0.9  

Ten en cuenta que también puedes especificar un rango de celdas con el argumento range. En este caso, el argumento skip no se tendrá en cuenta si lo especificas.

read_excel(ruta_archivo, range = "B1:B5")
# A tibble: 4 x 1
  value    
  <chr>    
1 Clippy   
2 paperclip
3 39083    
4 0.9 

Además, si quieres evitar leer los nombres de las columnas, puedes establecer el argumento col_names como FALSE:

read_excel(ruta_archivo, col_names = FALSE)
New names:
* `` -> ...1
* `` -> ...2
                  ...1      ...2
1                 name     value
2                 Name    Clippy
3              Species paperclip
4 Approx date of death     39083
5      Weight in grams       0.9

Sin embargo, es posible que hayas notado que la salida es de clase tibble (un tipo moderno de data frame). Si quieres que la salida sea de clase data.frame, deberás usar la función as.data.frame de la siguiente manera:

data <- read_excel(ruta_archivo, skip = 1)
as.data.frame(data)
                  Name    Clippy
1              Species paperclip
2 Approx date of death     39083
3      Weight in grams       0.9

Recuerda que la función read_excel ‘adivina’ la extensión de archivo. No obstante, si conoces la extensión del archivo que vas a leer, puedes usar la función correspondiente de las siguientes para evitar ese proceso de ‘adivinación’:

# Si conoces la extensión del archivo
# usa una de estas dos funciones

# Para archivos XLS
read_xls()

# Para archivos XLSX
read_xlsx()

El paquete openxlsx

El paquete openxlsx usa Rcpp y, como no depende de JAVA, es una alternativa interesante al paquete readxl para leer un archivo Excel en R. Las diferencias respecto al paquete anterior son que la salida es de clase data.frame por defecto en lugar de tibble y que su uso principal no es solo la importación de archivos de Excel, ya que también proporciona una amplia variedad de funciones para escribir, diseñar y editar archivos de Excel.

La función para leer archivos XLSX se llama read.xlsx:

# install.packages("openxlsx")
library(openxlsx)

read.xlsx(ruta_archivo)
                  name     value
1                 Name    Clippy
2              Species paperclip
3 Approx date of death     39083
4      Weight in grams       0.9

Como en la función del paquete anterior, existen varios argumentos que puedes personalizar, como sheet, skip o colNames. Si quieres seleccionar celdas específicas puedes usar los argumentos rows y cols. Recuerda escribir ?read.xlsx o help(read.xlsx) para obtener información adicional.

read.xlsx(ruta_archivo, cols = 1:2, rows = 2:3)
     Name    Clippy
1 Species paperclip

El paquete xlsx

Aunque este paquete requiere que JAVA esté instalado en tu ordenador, es una opción muy popular. Las funciones principales para importar archivos de Excel son read.xlsx y read.xlsx2. El segundo tiene ligeras diferencias en los argumentos predeterminados y hace más trabajo en JAVA, logrando un mejor rendimiento.

# install.packages("xlsx")
library(xlsx)

read.xlsx(ruta_archivo)
read.xlsx2(ruta_archivo)

Puedes personalizar diversos argumentos, como sheetIndex, sheetName, header, rowIndex, colIndex, entre otros. Ejecuta ?read.xlsx o help(read.xlsx) para obtener detalles adicionales.

El paquete XLConnect

Una alternativa al paquete xlsx es XLConnect, que permite escribir, leer y dar formato a archivos de Excel. Para leer un Excel en R puedes usar la función readWorksheetFromFile como sigue. Recomendamos ejecutar ??XLConnect para buscar información adicional de los argumentos de cada función del paquete.

# install.packages("XLConnect")
library(XLConnect)

data <- readWorksheetFromFile(ruta_archivo, sheet = "list-column",
                              startRow = 1, endRow = 5,
                              startCol = 1, endCol = 2)

En caso de que quieras cargar varias hojas, se recomienda utilizar la función loadWorkbook y luego cargar cada hoja con la función readWorksheet:

load <- loadWorkbook(ruta_archivo)

data <- readWorksheet(load, sheet = "list-column",
                      startRow = 1, endRow = 5,
                      startCol = 1, endCol = 2)

data2 <- readWorksheet(load, sheet = "two-row-header",
                       startRow = 1, endRow = 3,
                       startCol = 1, endCol = 4)

Además, este paquete proporciona una función para cargar regiones con nombre de Excel. Análogo al ejemplo anterior, puedes importar solo una región con readNamedRegionFromFile, especificando el nombre del archivo (si el archivo está en tu directorio de trabajo) o la ruta del archivo y el nombre de la región en otro caso.

data <- readNamedRegionFromFile(file, # Ruta del archivo
                                name, # Nombre de la región
                                ...)  # Argumentos de readNamedRegion()

Si quieres cargar varias regiones con nombre, puedes cargar el libro de Excel con la función loadWorkbook y luego importar cada región con la función readNamedRegion.

cargar <- loadWorkbook(ruta_archivo)

data <- readNamedRegion(cargar, name_Region_1, ...)
data2 <- readNamedRegion(cargar, name_Region_2, ...)

Cabe mencionar que si tienes problemas con los paquetes que requieren JAVA, puedes obtener y establecer la ruta de JAVA en R con los siguientes códigos:

# Imprime la ruta de JAVA en R
Sys.getenv("JAVA_HOME")

# Establece la ruta de JAVA
Sys.setenv(JAVA_HOME = "path_to_jre_java_folder")

Ten en cuenta que deberás especificar la ruta a la carpeta jre dentro de la carpeta Java de tu ordenador, que por lo general se encontrará en Archivos de Programa.

Convertir archivos XLSX a CSV en R

Por último, también podrías convertir tus archivos de Excel a formato CSV y leer el archivo CSV en R. Para este propósito, puedes usar la función convert del paquete rio. Una alternativa sería guardar directamente el archivo de Excel como CSV con el menú de Microsoft Excel.

# install.packages("rio")
library(rio)

convert(ruta_archivo, "file.csv")