install.packages("tidyverse")
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
.
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.
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.