Planilhas do Excel no R

Dados do Excel ao R de maneira fácil e rápida.
Data de Publicação

7 de agosto de 2024

Geralmente trabalhamos com diversas fontes de dados. Uma das formas mais comuns de armazenamento de dados são os arquivos em formato Excel, com as extensões .xls e .xlsx. Nesta postagem vamos explorar as funcionalidades do readxl, um pacote parte do tidyverse que facilita a importação de dados do Excel para o R.

Instalação

A maneira mais simples e rápida de instalar a última versão do pacote readxl diretamente do CRAN é instalar o próprio tidyverse.

install.packages("tidyverse")

De todo modo, é necessário carregar o pacote readxl explicitamente, pois o readxl não faz parte do core tidyverse (ou seja, não é carregado com library(tidyverse))

library(tidyverse)
#> ── Attaching core tidyverse packages ───────────────────── tidyverse 2.0.0 ──
#> ✔ dplyr     1.1.4     ✔ readr     2.1.5
#> ✔ forcats   1.0.0     ✔ stringr   1.5.1
#> ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
#> ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
#> ✔ purrr     1.0.4     
#> ── Conflicts ─────────────────────────────────────── tidyverse_conflicts() ──
#> ✖ dplyr::filter() masks stats::filter()
#> ✖ dplyr::lag()    masks stats::lag()
#> ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)

Exemplos de arquivos Excel

O readxl vem de fábrica com alguns exemplos de aquivo Excel (ambos em .xls ou .xlsx) que podemos usar para praticar o uso do pacote de forma prática. Para poder ver quais arquivos estão disponibilizados, basta usar o readxl_example() sem parâmetros.

readxl_example()
#>  [1] "clippy.xls"    "clippy.xlsx"   "datasets.xls"  "datasets.xlsx"
#>  [5] "deaths.xls"    "deaths.xlsx"   "geometry.xls"  "geometry.xlsx"
#>  [9] "type-me.xls"   "type-me.xlsx"

Para obter o caminho de um dos exemplos listados, devemos simplesmente usar a função readxl_example() com um dos arquivos disponíveis.

readxl_example("datasets.xlsx")
#> [1] "/home/lucasdasilva/R/x86_64-redhat-linux-gnu-library/4.4/readxl/extdata/datasets.xlsx"

Importação arquivos de Excel e planilhas

A função read_excel() importa arquivos Excel, seja a extensão do arquivo .xls ou .xlsx.

# Obtém o caminho para o arquivo de exemplo "deaths.xlsx"
# Salva o caminho no objeto "exemplo_xlsx"
example_xlsx <- readxl_example("datasets.xlsx")
example_xlsx
#> [1] "/home/lucasdasilva/R/x86_64-redhat-linux-gnu-library/4.4/readxl/extdata/datasets.xlsx"

# Lê o arquivo
read_excel(example_xlsx)
#> # A tibble: 32 × 11
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
#> 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
#> 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
#> 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
#> 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
#> 6  18.1     6   225   105  2.76  3.46  20.2     1     0     3     1
#> # ℹ 26 more rows

Por padrão, o read_excel() importa a primeira planilha do arquivo Excel. Para saber quantas planilhas um arquivo de Excel possui, usamos o excel_sheets().

excel_sheets(example_xlsx)
#> [1] "mtcars"   "chickwts" "quakes"

Para o read_excel() importar outra planilha é necessário especificar o número ou nome com o parâmetro sheet (o segundo parâmetro).

# Por padrão, o read_excel importa a primeira planilha do arquivo Excel
# Ou seja, neste caso o read_excel importa a planilha chamada "mtcars" por padrão
read_excel(example_xlsx)
#> # A tibble: 32 × 11
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
#> 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
#> 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
#> 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
#> 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
#> 6  18.1     6   225   105  2.76  3.46  20.2     1     0     3     1
#> # ℹ 26 more rows

# Podemos especificar qual planilha queremos importar com o nome ou número da planilha
# Ou seja, podemos importar a planilha "mtcars" com seu próprio nome
read_excel(example_xlsx, sheet = "mtcars")
#> # A tibble: 32 × 11
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
#> 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
#> 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
#> 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
#> 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
#> 6  18.1     6   225   105  2.76  3.46  20.2     1     0     3     1
#> # ℹ 26 more rows

# Ou podemos importar a planilha "mtcars" com o número
read_excel(example_xlsx, sheet = 1)
#> # A tibble: 32 × 11
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
#> 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
#> 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
#> 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
#> 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
#> 6  18.1     6   225   105  2.76  3.46  20.2     1     0     3     1
#> # ℹ 26 more rows

# Podemos especificar outra planilha pelo seu nome:
read_excel(example_xlsx, "quakes")
#> # A tibble: 1,000 × 5
#>     lat  long depth   mag stations
#>   <dbl> <dbl> <dbl> <dbl>    <dbl>
#> 1 -20.4  182.   562   4.8       41
#> 2 -20.6  181.   650   4.2       15
#> 3 -26    184.    42   5.4       43
#> 4 -18.0  182.   626   4.1       19
#> 5 -20.4  182.   649   4         11
#> 6 -19.7  184.   195   4         12
#> # ℹ 994 more rows

# Ou podemos especificar essa mesma planilha pelo seu número:
read_excel(example_xlsx, sheet = 2)
#> # A tibble: 71 × 2
#>   weight feed     
#>    <dbl> <chr>    
#> 1    179 horsebean
#> 2    160 horsebean
#> 3    136 horsebean
#> 4    227 horsebean
#> 5    217 horsebean
#> 6    168 horsebean
#> # ℹ 65 more rows

Intervalo de células

Exitem diversas formas de sinalizar quais células devem ser lidas. É até possível especificar a planilha em específico, se for fornecido um intervalo no estilo do Excel.

# Número máximo de linhas para importar
read_excel(example_xlsx, n_max = 3)
#> # A tibble: 3 × 11
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
#> 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
#> 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1

# Número de linhas para pular
read_excel(example_xlsx, skip = 3)
#> New names:
#> • `4` -> `4...2`
#> • `1` -> `1...8`
#> • `1` -> `1...9`
#> • `4` -> `4...10`
#> • `1` -> `1...11`
#> # A tibble: 29 × 11
#>   `22.8` `4...2` `108`  `93` `3.85` `2.3199999999999998` `18.61` `1...8`
#>    <dbl>   <dbl> <dbl> <dbl>  <dbl>                <dbl>   <dbl>   <dbl>
#> 1   21.4       6  258    110   3.08                 3.22    19.4       1
#> 2   18.7       8  360    175   3.15                 3.44    17.0       0
#> 3   18.1       6  225    105   2.76                 3.46    20.2       1
#> 4   14.3       8  360    245   3.21                 3.57    15.8       0
#> 5   24.4       4  147.    62   3.69                 3.19    20         1
#> 6   22.8       4  141.    95   3.92                 3.15    22.9       1
#> # ℹ 23 more rows
#> # ℹ 3 more variables: `1...9` <dbl>, `4...10` <dbl>, `1...11` <dbl>

# Intervalo de linhas e colunas para importar
read_excel(example_xlsx, range = "C1:E4")
#> # A tibble: 3 × 3
#>    disp    hp  drat
#>   <dbl> <dbl> <dbl>
#> 1   160   110  3.9 
#> 2   160   110  3.9 
#> 3   108    93  3.85

# Intervado de linhas para importar
read_excel(example_xlsx, range = cell_rows(1:4))
#> # A tibble: 3 × 11
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
#> 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
#> 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1

# Intervalo de colunas para importar
read_excel(example_xlsx, range = cell_cols("B:D"))
#> # A tibble: 32 × 3
#>     cyl  disp    hp
#>   <dbl> <dbl> <dbl>
#> 1     6   160   110
#> 2     6   160   110
#> 3     4   108    93
#> 4     6   258   110
#> 5     8   360   175
#> 6     6   225   105
#> # ℹ 26 more rows

# Intervalo de linhas e colunas de uma planilha específica
read_excel(example_xlsx, range = "mtcars!B1:D5")
#> # A tibble: 4 × 3
#>     cyl  disp    hp
#>   <dbl> <dbl> <dbl>
#> 1     6   160   110
#> 2     6   160   110
#> 3     4   108    93
#> 4     6   258   110

Especificação de colunas

Especificação de colunas é o que define que tipo de dado cada coluna do arquivo Excel será ao ser importado. Por padrão, o read_excel() analisa as primeiras 1000 observações e faz um chute educado sobre qual tipo de dado cada variável possui. É possível aumentar o número de linhas com o parâmetro guess_max.

Para especificar o tipo de dado de colunas, usamos o parâmetro col_types. Para definir todas as variáveis como, por exemplo, strings, usamos:

read_excel(example_xlsx, col_types = "text")
#> # A tibble: 32 × 11
#>   mpg                cyl   disp  hp    drat  wt               qsec           
#>   <chr>              <chr> <chr> <chr> <chr> <chr>            <chr>          
#> 1 21                 6     160   110   3.9   2.62             16.46          
#> 2 21                 6     160   110   3.9   2.875            17.02          
#> 3 22.8               4     108   93    3.85  2.3199999999999… 18.61          
#> 4 21.4               6     258   110   3.08  3.2149999999999… 19.44000000000…
#> 5 18.7               8     360   175   3.15  3.44             17.02          
#> 6 18.100000000000001 6     225   105   2.76  3.46             20.22          
#> # ℹ 26 more rows
#> # ℹ 4 more variables: vs <chr>, am <chr>, gear <chr>, carb <chr>

Para definir cada coluna individualmente, podemos fazer o seguinte:

read_excel(
    example_xlsx,
    sheet = "quakes",
    col_types = c("numeric", "numeric", "numeric", "numeric", "guess")
)
#> # A tibble: 1,000 × 5
#>     lat  long depth   mag stations
#>   <dbl> <dbl> <dbl> <dbl>    <dbl>
#> 1 -20.4  182.   562   4.8       41
#> 2 -20.6  181.   650   4.2       15
#> 3 -26    184.    42   5.4       43
#> 4 -18.0  182.   626   4.1       19
#> 5 -20.4  182.   649   4         11
#> 6 -19.7  184.   195   4         12
#> # ℹ 994 more rows

Os tipos de colunas disponíveis são:

  • Skip (pula uma coluna)
  • Guess (chuta um tipo)
  • Logicals (valores lógicos)
  • Numeric (numéricos)
  • Text (texto)
  • Date (datas)
  • List (listas, para múltiplos tipos de dados)

Exemplos:

logical numeric text date list
TRUE 2 hello 1999-01-01 world
FALSE 3.14 world 2004-02-21 1

Importação de várias planilhas

Para ler múltiplas planilhas em um arquivo de Excel, podemos fazer um código quick and dirty para resolver nosso problema…

excel_sheets(example_xlsx)
#> [1] "mtcars"   "chickwts" "quakes"

dataset_1 <- read_excel(example_xlsx, sheet = 1)
dataset_2 <- read_excel(example_xlsx, sheet = 2)
dataset_3 <- read_excel(example_xlsx, sheet = 3)

Neste método apenas é possível importar cada planilha de um arquivo individualmente. Não é preciso de muito brainpower para perceber que essa prática não é muito eficiente se for necessário fazer isso com diversos arquivos de Excel (ou se o arquivo de Excel tenha diversas planilhas).

Por isso, é recomendável usar outro pacote da coleção tidyverse em combinação como o readxl, o purrr, que nos oferece as ferramentas necessárias para automatizar tarefas repetitivas. Para conhecer o purrr e suas funcionalidades, basta ficar atento no blog que irei abordar sobre este e de outros pacotes.

Exportação de arquivos Excel

Vamos criar um pequeno data frame que podemos exportar.

frutas <- tibble(
    frutas = factor(c("banana", "maçã", "laranja")),
    quantidade = c(8, 4, 5)
)

frutas
#> # A tibble: 3 × 2
#>   frutas  quantidade
#>   <fct>        <dbl>
#> 1 banana           8
#> 2 maçã             4
#> 3 laranja          5

Você pode exportar os dados como um arquivo Excel usando o comando write_xlsx(), do pacote writexl.

library(writexl)

write_xlsx(frutas, path = "diretorio/arquivo.xlsx")

De toda forma, é sempre recomendável salvar os dados em .rds, pois os tipos dos dados salvos podem ser perdidos quando importamos os dados novamente de um arquivo .xlsx ou .csv. Assim, arquivos .rds são um pouco mais confiáveis em guardar dados.