11.5 Hojas de cálculo de Excel

Un formato usado con mucha frecuencia para almacenar archivos son las hojas de cálculo, en particular las generadas por el paquete Microsoft Excel.

R base no tiene una función para importar archivos almacenados en archivos con extensión .xsl y .xslx, creados con Excel.

Para importar datos desde este tipo de archivos, necesitamos instalar el paquete readxl, que contiene funciones específicas para realizar esta tarea.

Usamos la función installpackages(), como lo vimos en el capítulo 3

install.packages("readxl")

Ya instalado, cargamos el readxl a nuestra sesión de trabajo.

library(readxl)

Usaremos, principalmente dos funciones de este paquete.

  • read_excel(): Para importar archivos .xls y xlsx.
  • excel_sheets(): Para obtener los nombres de las pestañas en una hoja de cálculo de Excel.

Para probar estas funciones, descargaremos una hoja de cálculo de prueba. Nota que hemos establecido el argumento mode = "wb" para asegurar que el archivo se descargue correctamente.

download.file(
  url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/data_frames.xlsx", 
  destfile = "data_frames.xlsx", 
  mode = "wb"
) 

Si intentamos leer las primeras cinco líneas de data_frames.xlsx, confirmamos que este es un archivo que no tiene forma rectangular, de tabla.

readLines("data_frames.xlsx", n = 5)
## Warning in readLines("data_frames.xlsx", n = 5): line 1 appears to contain
## an embedded nul
## Warning in readLines("data_frames.xlsx", n = 5): incomplete final line
## found on 'data_frames.xlsx'
## [1] "PK\003\004\024"                                                                                                      
## [2] "\177߉YTU,B õ’(±çmöL\177¸jêd\t\001\215³¹èf\035‘\200-œ6v–‹¯É{ú$\022$eµª\235…\\¬\001Åpp\177ן¬=`ÂÕ\026sQ\021ùg)±¨ Q\2309\017–WJ\027"

En caso de que tengamos instalado Excel o algún otro programa compatible con archivos de hoja de cálculo, como LibreOffice Calc o Number, podemos pedir a R que abra este archivo con file.show(). De este modo podemos explorar su contenido.

file.show("data_frames.xlsx")

La función excel_sheets() nos devuelve el nombre de las pestañas como un vector.

excel_sheets("data_frames.xlsx")
## [1] "iris"  "trees"

Este archivo tiene dos pestañas, llamadas iris y trees.

Intentaremos importar la pestaña iris con read_excel(). Esta función tiene los siguientes argumentos principales.

  • path: La ruta del archivo a importar. Si no especificamos una ruta completa, será buscado en nuestro directorio de trabajo.
  • sheet: El nombre de la pestaña a importar. Si no especificamos este argumento, read_excel() intentará leer la primera pestaña de la hoja de cálculo.
  • range: Cadena de texto con el rango de celdas a importar, escrito con el formato usado en Excel. Por ejemplo, “A1:B:10”.
  • col_names: Con este argumento indicamos si la pestaña que vamos a importar tiene encabezados para usar como nombres de columna. Por defecto su valor es TRUE. Si no tenemos encabezados, podemos dar un vector con nombres para asignar a las columnas.

Puedes consultar todos los argumentos de esta función ejecutando ?read_excel.

Probemos read_excel().

iris_excel <- read_excel(path = "data_frames.xlsx", sheet = "iris")

Nuestro resultado es un data frame.

iris_excel
## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <chr>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            1.4         0.2 setosa 
##  3          4.7         3.2          1.3         0.2 setosa 
##  4          4.6         3.1          1.5         0.2 setosa 
##  5          5           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # ... with 140 more rows

Si los datos en la hoja de cálculo tienen forma de tabla, read_excel() no tendrá problemas para importarlos. Cuando este no es el caso, usamos el argumento range para extraer sólo la información que nos interesa.

Intentamos importar la pestaña trees.

trees_excel <- read_excel(path = "data_frames.xlsx", sheet = "trees")

# Resultado
trees_excel
## # A tibble: 34 x 6
##    `Datos trees`  X__1  X__2  X__3 X__4  X__5                             
##    <chr>         <dbl> <dbl> <dbl> <lgl> <chr>                            
##  1 <NA>           NA      NA  NA   NA    <NA>                             
##  2 <NA>            8.3    70  10.3 NA    <NA>                             
##  3 <NA>            8.6    65  10.3 NA    <NA>                             
##  4 <NA>            8.8    63  10.2 NA    Los nombres de las variables son~
##  5 <NA>           10.5    72  16.4 NA    <NA>                             
##  6 <NA>           10.7    81  18.8 NA    <NA>                             
##  7 <NA>           10.8    83  19.7 NA    <NA>                             
##  8 <NA>           11      66  15.6 NA    <NA>                             
##  9 <NA>           11      75  18.2 NA    <NA>                             
## 10 <NA>           11.1    80  22.6 NA    <NA>                             
## # ... with 24 more rows

Los resultados no lucen bien porque los datos en la pestaña no tienen forma de tabla.

Ajustamos los argumentos de read_excel() para leer correctamente la infomación de la pestaña. Al explorar manualmente el archivo data.frames.xlsx, podemos localizar el rango en el que se encuentran los datos (de las celdas B3 a D33) y los nombres de las columnas (Girth, Height y Volume).

Probemos importar de nuevo con esta información.

trees_excel <- read_excel(path = "data_frames.xlsx", sheet = "trees", 
                          range = "B3:D33", 
                          col_names = c("Girth", "Height", "Volume"))

# Resultado
trees_excel
## # A tibble: 31 x 3
##    Girth Height Volume
##    <dbl>  <dbl>  <dbl>
##  1   8.3     70   10.3
##  2   8.6     65   10.3
##  3   8.8     63   10.2
##  4  10.5     72   16.4
##  5  10.7     81   18.8
##  6  10.8     83   19.7
##  7  11       66   15.6
##  8  11       75   18.2
##  9  11.1     80   22.6
## 10  11.2     75   19.9
## # ... with 21 more rows

Esta vez hemos tenido éxito y los datos importados son los correctos.

El paquete readxl tiene más funciones para trabajar con hojas de cálculo además de read_excel() y excel_sheets(), pero revisar cada una de ellas sale del alcance de este libro. Puedes conocer más sobre ellas en la documentación de readxl, llamando help(package = "readxl").