20  Planilhas

20.1 Introdução

No Capítulo 7 você aprendeu sobre importação de dados de arquivos de texto como .csv e .tsv. Agora chegou a hora de aprender a extrair dados de planilhas, tanto do Excel quanto do Planilhas Google (Google Sheets). Para isto, usaremos muito do que você aprendeu no Capítulo 7, mas discutiremos também considerações adicionais e complexidades presentes quando trabalhamos com dados vindos de planilhas.

Se você ou seus colaboradores estão usando planilhas para organizar dados, nós recomendamos fortemente a leitura do artigo “Organização de Dados em Planilhas (Data Organization in Spreadsheets) de Karl Broman e Kara Woo: https://doi.org/10.1080/00031305.2017.1375989. As boas práticas presentes neste artigo evitarão dores de cabeça ao importar dados de planilhas para análise e visualização com o R.

20.2 Excel

O Microsoft Excel é um software muito utilizado onde os dados são organizados em planilhas (worksheets) dentro de arquivos Excel (spreadsheet).

20.2.1 Pré-requisitos

Nesta seção, você aprenderá como carregar dados de arquivos do Excel para o R com o pacote readxl. Este pacote faz parte dos componentes secundários (non-core) do tidyverse, portanto devemos carregá-lo explicitamente, apesar dele já ser instalado automaticamente quando você instala o tidyverse. Posteriormente, usaremos também o pacote writexl, que nos permite criar planilhas do Excel.

20.2.2 Iniciando

Muitas funções do readxl te permitem importar arquivos do Excel para o R:

  • read_xls() importa arquivos Excel que estejam no formato xls.
  • read_xlsx() importa arquivos Excel que estejam no formato xlsx.
  • read_excel() pode importar arquivos em ambos os formatos xls e xlsx. Ela identifica o formato baseado no tipo de arquivo de entrada.

Estas funções possuem uma sintaxe similar às outras funções introduzidas anteriormente para importar outros tipos de arquivos, por exemplo: read_csv(), read_table(), etc. No restante deste capítulo focaremos no uso da função read_excel().

20.2.3 Importando arquivos do Excel

A Figura 20.1 mostra como é a planilha do Excel que iremos importar para o R. Esta planilha pode ser baixada em https://github.com/cienciadedatos/pt-r4ds/raw/traducao-pt-2ed/data/estudantes.xlsx.

Uma visão da planilha de estudantes no Excel. A planilha possui informações de 6 estudantes, seus IDs, nomes completos, comida favorita, plano alimentar e idade.
Figura 20.1: Planilha do Excel chamada estudantes.xlsx.

O primeiro argumento da read_excel() é o caminho (path) do arquivo a ser importado.

estudantes <- read_excel("data/estudantes.xlsx")

read_excel() irá importar o arquivo como um tibble.

estudantes
#> # A tibble: 6 × 5
#>   `ID Estudante` `Nome Completo` comida.favorita    planoDeRefeição     IDADE
#>            <dbl> <chr>           <chr>              <chr>               <chr>
#> 1              1 Igor Ribeiro    Iogurte de Morango Apenas Almoço       4.0  
#> 2              2 Fernanda Costa  Batatas Fritas     Apenas Almoço       5.0  
#> 3              3 Daniel Lima     N/A                Café da Manhã e Al… 7.0  
#> 4              4 Carla Oliveira  Anchovas           Apenas Almoço       <NA> 
#> 5              5 Fábio Pêra      Pizza              Café da Manhã e Al… cinco
#> 6              6 Bruno Souza     Sorvete            Apenas Almoço       6.0

Temos seis estudantes nos dados e cinco variáveis para cada estudante. Entretanto, existem algumas coisas que devemos abordar neste conjunto de dados:

  1. Os nomes das colunas estão com formato inconsistente. Você pode fornecer nomes que seguem um formato consistente; nós recomendamos o snake_case usando o argumento col_names.

    read_excel(
      "data/estudantes.xlsx",
      col_names = c("estudante_id", "nome_completo", "comida_favorita", "refeicao_plano", "idade")
    )
    #> # A tibble: 7 × 5
    #>   estudante_id nome_completo  comida_favorita    refeicao_plano         idade
    #>   <chr>        <chr>          <chr>              <chr>                  <chr>
    #> 1 ID Estudante Nome Completo  comida.favorita    planoDeRefeição        IDADE
    #> 2 1.0          Igor Ribeiro   Iogurte de Morango Apenas Almoço          4.0  
    #> 3 2.0          Fernanda Costa Batatas Fritas     Apenas Almoço          5.0  
    #> 4 3.0          Daniel Lima    N/A                Café da Manhã e Almoço 7.0  
    #> 5 4.0          Carla Oliveira Anchovas           Apenas Almoço          <NA> 
    #> 6 5.0          Fábio Pêra     Pizza              Café da Manhã e Almoço cinco
    #> 7 6.0          Bruno Souza    Sorvete            Apenas Almoço          6.0

    Infelizmente, apenas isto não é o suficiente. Temos agora o nome das variáveis como gostaríamos, mas o que era anteriormente a linha de cabeçalho passou a aparecer nos dados como a primeira linha das observações. Você pode pular explicitamente esta linha usando o argumento skip.

    read_excel(
      "data/estudantes.xlsx",
      col_names = c("estudante_id", "nome_completo", "comida_favorita", "refeicao_plano", "idade"),
      skip = 1
    )
    #> # A tibble: 6 × 5
    #>   estudante_id nome_completo  comida_favorita    refeicao_plano         idade
    #>          <dbl> <chr>          <chr>              <chr>                  <chr>
    #> 1            1 Igor Ribeiro   Iogurte de Morango Apenas Almoço          4.0  
    #> 2            2 Fernanda Costa Batatas Fritas     Apenas Almoço          5.0  
    #> 3            3 Daniel Lima    N/A                Café da Manhã e Almoço 7.0  
    #> 4            4 Carla Oliveira Anchovas           Apenas Almoço          <NA> 
    #> 5            5 Fábio Pêra     Pizza              Café da Manhã e Almoço cinco
    #> 6            6 Bruno Souza    Sorvete            Apenas Almoço          6.0
  2. Na coluna comida_favorita, uma das observações está como N/A, que significa “não disponível” (not available) mas essa forma não é reconhecida como um valor não disponível (NA) do R (veja a diferença entre este N/A e o presente na idade do quarto estudante da lista). Você pode definir quais cadeias de caracteres (strings) devem ser reconhecidas pelo R como NA utilizando o argumento na. Por padrão, apenas "" (string vazia, ou, quando trabalhando com uma planilha, uma célula vazia ou com a fórmula =NA()) é reconhecida como um NA.

    read_excel(
      "data/estudantes.xlsx",
      col_names = c("estudante_id", "nome_completo", "comida_favorita", "refeicao_plano", "idade"),
      skip = 1,
      na = c("", "N/A")
    )
    #> # A tibble: 6 × 5
    #>   estudante_id nome_completo  comida_favorita    refeicao_plano         idade
    #>          <dbl> <chr>          <chr>              <chr>                  <chr>
    #> 1            1 Igor Ribeiro   Iogurte de Morango Apenas Almoço          4.0  
    #> 2            2 Fernanda Costa Batatas Fritas     Apenas Almoço          5.0  
    #> 3            3 Daniel Lima    <NA>               Café da Manhã e Almoço 7.0  
    #> 4            4 Carla Oliveira Anchovas           Apenas Almoço          <NA> 
    #> 5            5 Fábio Pêra     Pizza              Café da Manhã e Almoço cinco
    #> 6            6 Bruno Souza    Sorvete            Apenas Almoço          6.0
  3. Um outro ponto que devemos observar é que a coluna idade é importada como uma variável texto, quando, na realidade, deveria ser numérica. Assim como na read_csv() e outras funções que importam dados de arquivos texto, você pode passar o argumento col_types para a read_excel() e especificar os tipos das colunas das variáveis que você está importanto. Porém, a sintaxe é um pouco diferente. Suas opções são: "skip", "guess", "logical", "numeric", "date", "text" ou "list".

    read_excel(
      "data/estudantes.xlsx",
      col_names = c("estudante_id", "nome_completo", "comida_favorita", "refeicao_plano", "idade"),
      skip = 1,
      na = c("", "N/A"),
      col_types = c("numeric", "text", "text", "text", "numeric")
    )
    #> Warning: Expecting numeric in E6 / R6C5: got 'cinco'
    #> # A tibble: 6 × 5
    #>   estudante_id nome_completo  comida_favorita    refeicao_plano         idade
    #>          <dbl> <chr>          <chr>              <chr>                  <dbl>
    #> 1            1 Igor Ribeiro   Iogurte de Morango Apenas Almoço              4
    #> 2            2 Fernanda Costa Batatas Fritas     Apenas Almoço              5
    #> 3            3 Daniel Lima    <NA>               Café da Manhã e Almoço     7
    #> 4            4 Carla Oliveira Anchovas           Apenas Almoço             NA
    #> 5            5 Fábio Pêra     Pizza              Café da Manhã e Almoço    NA
    #> 6            6 Bruno Souza    Sorvete            Apenas Almoço              6

    Porém, apenas isso também não produz o resultado desejado. Definindo que idade deve ser numérica, nós transformamos a célula com um valor não-numérico (aquela com valor cinco) em um NA. Neste caso, você deve importar idade como "text" e então fazer a mundança após os dados estarem carregados no R.

    estudantes <- read_excel(
      "data/estudantes.xlsx",
      col_names = c("estudante_id", "nome_completo", "comida_favorita", "refeicao_plano", "idade"),
      skip = 1,
      na = c("", "N/A"),
      col_types = c("numeric", "text", "text", "text", "text")
    )
    
    estudantes <- estudantes |>
      mutate(
        idade = if_else(idade == "cinco", "5", idade),
        idade = parse_number(idade)
      )
    
    estudantes
    #> # A tibble: 6 × 5
    #>   estudante_id nome_completo  comida_favorita    refeicao_plano         idade
    #>          <dbl> <chr>          <chr>              <chr>                  <dbl>
    #> 1            1 Igor Ribeiro   Iogurte de Morango Apenas Almoço              4
    #> 2            2 Fernanda Costa Batatas Fritas     Apenas Almoço              5
    #> 3            3 Daniel Lima    <NA>               Café da Manhã e Almoço     7
    #> 4            4 Carla Oliveira Anchovas           Apenas Almoço             NA
    #> 5            5 Fábio Pêra     Pizza              Café da Manhã e Almoço     5
    #> 6            6 Bruno Souza    Sorvete            Apenas Almoço              6

Foram necessários vários passos com tentativas e erros para importar os dados da maneira que precisávamos, e isto não é algo inesperado. A ciência de dados é um processo iterativo, e este processo de iteração pode ser ainda mais entediante quando importamos dados de planilhas se comparado a quando importamos dados de arquivos textos (dados retangulares) pois os humanos tendem a inserir dados nas planilhas e usá-las não apenas para armazenar os dados, mas também para compartilhamento e communicação.

Não há como saber exatamente como os dados serão importados até você carregá-los e dar uma olhada. Bem, na verdade há um jeito. Você pode abrir o arquivo no Excel e dar uma olhada. Se você for fazer isso, recomendamos fazer uma cópia do arquivo original e usar a outra cópia para navegar pelo arquivo, deixando a primeira inalterada para ser carregada pelo R. Isto certificará que você não irá sobreescrever acidentalmente nada na planilha enquanto a inspeciona. Você também não precisa ter medo de fazer o que fizemos aqui: Carregar o arquivo, dar uma olhada, fazer os ajustes no seu código, carregar novamente e repetir tudo até que esteja contente com o resultado.

20.2.4 Importando planilhas

Uma característica importante que distingue arquivos do Excel de arquivos texto, é a noção de várias planilhas (ou abas) dentro do mesmo arquivo. A Figura 20.2 mostra um arquivo Excel com várias planilhas. Os dados são do pacote palmerpenguins, e você pode fazer o download como um arquivo Excel em https://github.com/cienciadedatos/pt-r4ds/raw/traducao-pt-2ed/data/pinguins.xlsx. Cada planilha (ou aba) contém informações de pinguins de diferentes ilhas onde os dados foram coletados.

Uma visão do arquivo de pinguins no Excel. O arquivo possui três planilhas: Ilha Torgersen, Ilha Biscoe e Ilha Dream.
Figura 20.2: Arquivo Excel chamado pinguins.xlsx contendo três planilhas (ou abas).

Você pode importar uma única planilha usando o argumento sheet na função read_excel(). Por padrão, o que utilizamos até agora, a primeira planilha é importada.

read_excel("data/pinguins.xlsx", sheet = "Ilha Torgersen")
#> New names:
#> • `` -> `...1`
#> # A tibble: 52 × 9
#>   ...1  especie           ilha      comprimento_bico profundidade_bico
#>   <chr> <chr>             <chr>                <dbl>             <dbl>
#> 1 1     Pinguim-de-adélia Torgersen             39.1              18.7
#> 2 2     Pinguim-de-adélia Torgersen             39.5              17.4
#> 3 3     Pinguim-de-adélia Torgersen             40.3              18  
#> 4 4     Pinguim-de-adélia Torgersen             NA                NA  
#> 5 5     Pinguim-de-adélia Torgersen             36.7              19.3
#> 6 6     Pinguim-de-adélia Torgersen             39.3              20.6
#> # ℹ 46 more rows
#> # ℹ 4 more variables: comprimento_nadadeira <dbl>, massa_corporal <dbl>, …

Algumas variáveis que parecem conter dados numéricos, são importadas como caracteres (texto) devido à cadeia de caractere "NA" não ser reconhecida como um verdadeiro NA.

pinguins_torgersen <- read_excel("data/pinguins.xlsx", sheet = "Ilha Torgersen", na = "NA")
#> New names:
#> • `` -> `...1`

pinguins_torgersen
#> # A tibble: 52 × 9
#>   ...1  especie           ilha      comprimento_bico profundidade_bico
#>   <chr> <chr>             <chr>                <dbl>             <dbl>
#> 1 1     Pinguim-de-adélia Torgersen             39.1              18.7
#> 2 2     Pinguim-de-adélia Torgersen             39.5              17.4
#> 3 3     Pinguim-de-adélia Torgersen             40.3              18  
#> 4 4     Pinguim-de-adélia Torgersen             NA                NA  
#> 5 5     Pinguim-de-adélia Torgersen             36.7              19.3
#> 6 6     Pinguim-de-adélia Torgersen             39.3              20.6
#> # ℹ 46 more rows
#> # ℹ 4 more variables: comprimento_nadadeira <dbl>, massa_corporal <dbl>, …

Alternativamente, você pode usar excel_sheets() para obter informações de todas as planilhas presentes em um arquivo Excel, e então importar aquela(s) em que você está interessado.

excel_sheets("data/pinguins.xlsx")
#> [1] "Ilha Biscoe"    "Ilha Dream"     "Ilha Torgersen"

Assim que você souber o(s) nome(s) da(s) planilha(s), você pode importá-la(s) individualmente com read_excel().

pinguins_biscoe <- read_excel("data/pinguins.xlsx", sheet = "Ilha Biscoe", na = "NA")
#> New names:
#> • `` -> `...1`
pinguins_dream  <- read_excel("data/pinguins.xlsx", sheet = "Ilha Dream", na = "NA")
#> New names:
#> • `` -> `...1`

Neste caso, o conjunto de dados completo está espalhado entre três planilhas distintas no arquivo. Cada planilha tem o mesmo número de colunas, mas diferentes números de linhas.

dim(pinguins_torgersen)
#> [1] 52  9
dim(pinguins_biscoe)
#> [1] 168   9
dim(pinguins_dream)
#> [1] 124   9

Nós podemos uní-las usando bind_rows().

pinguins <- bind_rows(pinguins_torgersen, pinguins_biscoe, pinguins_dream)
pinguins
#> # A tibble: 344 × 9
#>   ...1  especie           ilha      comprimento_bico profundidade_bico
#>   <chr> <chr>             <chr>                <dbl>             <dbl>
#> 1 1     Pinguim-de-adélia Torgersen             39.1              18.7
#> 2 2     Pinguim-de-adélia Torgersen             39.5              17.4
#> 3 3     Pinguim-de-adélia Torgersen             40.3              18  
#> 4 4     Pinguim-de-adélia Torgersen             NA                NA  
#> 5 5     Pinguim-de-adélia Torgersen             36.7              19.3
#> 6 6     Pinguim-de-adélia Torgersen             39.3              20.6
#> # ℹ 338 more rows
#> # ℹ 4 more variables: comprimento_nadadeira <dbl>, massa_corporal <dbl>, …

No Capítulo 26 falaremos sobre outras maneiras de fazer este tipo de coisa sem repetir código.

20.2.5 Importando parte de uma planilha

Uma vez que muitas pessoas usam arquivos do Excel tanto pra apresentação quanto para armazenamento dos dados, é muito comum encontrarmos células em uma planilha que não fazem parte dos dados que você quer importar para o R. A Figura 20.3 mostra um exemplo: no centro da planilha temos algo que se parece com um data frame, mas existem estranhos textos acima e abaixo dos dados.

Uma visão da planilha 'deaths' no Excel. A planilha possui quatro linhas no topo contém informações extras aos dados; o texto 'Por razôes de consistência no *layout* dos dados, algo que é realmente belo, continuarei a fazer notas por aqui.' está espalhado pelas quatro linhas. Então, há um *data frame* que inclui informações sobre os óbitos de 10 pessoas famosas, incluindo seus nomes, profissões, idades, se tinham filhos ou não, data de nascimento e óbito. Na parte de baixo, existem outras 4 linhas extras aos dados; no texto 'Isto tem sido realmente divertido, mas estamos nos desconectando agora!' está espalhado por estas quatro linhas finais.
Figura 20.3: Arquivo do Excel chamado deaths.xlsx

Esta planilha é um dos exemplos fornecidos com o pacote readxl. Você pode usar a função readxl_example() para localizar esta planilha no diretório em que o pacote foi instalado em seu computador. Esta função retorna o caminho para o arquivo do Excel, que você pode importar usando a read_excel() como de costume.

obitos_caminho <- readxl_example("deaths.xlsx")
obitos <- read_excel(obitos_caminho)
#> New names:
#> • `` -> `...2`
#> • `` -> `...3`
#> • `` -> `...4`
#> • `` -> `...5`
#> • `` -> `...6`
obitos
#> # A tibble: 18 × 6
#>   `Lots of people`    ...2       ...3  ...4     ...5          ...6           
#>   <chr>               <chr>      <chr> <chr>    <chr>         <chr>          
#> 1 simply cannot resi… <NA>       <NA>  <NA>     <NA>          some notes     
#> 2 at                  the        top   <NA>     of            their spreadsh…
#> 3 or                  merging    <NA>  <NA>     <NA>          cells          
#> 4 Name                Profession Age   Has kids Date of birth Date of death  
#> 5 David Bowie         musician   69    TRUE     17175         42379          
#> 6 Carrie Fisher       actor      60    TRUE     20749         42731          
#> # ℹ 12 more rows

As primeiras três linhas e as quatro linhas no final, não fazem parte do data frame. É possível eliminar estas linhas extras usando os argumentos skip e n_max, mas recomendamos utilizar intervalos (range) de células. No Excel, a célula superior esquerda é a A1. Conforme você se move pelas colunas para a direita, o título da célula segue a sequência do alfabeto, ou seja: B1, C1, etc. E conforme você se move para baixo na coluna, o número da célula aumenta, ex: A2, A3, etc.

Aqui, os dados que desejamos importar começam na célula A5 e terminam na célula F15. Na notação da planilha, temos A5:F15, que fornecemos para o argumento range:

read_excel(obitos_caminho, range = "A5:F15")
#> # A tibble: 10 × 6
#>   Name          Profession   Age `Has kids` `Date of birth`    
#>   <chr>         <chr>      <dbl> <lgl>      <dttm>             
#> 1 David Bowie   musician      69 TRUE       1947-01-08 00:00:00
#> 2 Carrie Fisher actor         60 TRUE       1956-10-21 00:00:00
#> 3 Chuck Berry   musician      90 TRUE       1926-10-18 00:00:00
#> 4 Bill Paxton   actor         61 TRUE       1955-05-17 00:00:00
#> 5 Prince        musician      57 TRUE       1958-06-07 00:00:00
#> 6 Alan Rickman  actor         69 FALSE      1946-02-21 00:00:00
#> # ℹ 4 more rows
#> # ℹ 1 more variable: `Date of death` <dttm>

20.2.6 Tipos de dados

Em arquivos CSV, todos os valores são strings”. Isto não é particularmente verdadeiro para os dados, mas é simples: tudo é uma string”.

Os dados intrínsecos nas planilhas Excel são mais complexos. Uma célula pode conter uma dessas quatro coisas:

  • Um booleano, como TRUE, FALSE, ou NA.

  • Um número, como “10” ou “10.5”.

  • Uma data/horário (datetime), que pode conter algo como “11/1/21” ou “11/1/21 3:00 PM”.

  • Um texto (string), como “dez”.

Quando trabalhamos com dados de planilhas, é importante ter em mente que os dados intrínsecos podem ser muito diferentes daquilo que vemos em uma célula. Por exemplo, o Excel não tem a noção de ‘inteiro’ (integer). Todos os números são armazenados como ponto flutuante (floating points), mas você pode optar em mostrar os dados de uma forma personalizada de casas decimais. Da mesma maneira, datas são na verdade armazenadas como números, especificamente número de segundos desde 1º de Janeiro de 1970. Você pode personalizar como você quer mostrar as datas no Excel aplicando formatações. Para confundir ainda mais, também é possível ter algo que se parece com um número, mas é na verdade uma string (por exemplo: , digite '10 em uma célula no Excel).

Estas diferenças em como os dados intrínsecos são armazenados vs. como eles são mostrados na tela podem causar surpresas quando os dados são importados para o R. Por padrão, readxl tentará adivinhar o tipo de dado de uma determinada coluna. Um fluxo de trabalho recomendado é deixar o readxl adivinhar os tipos das colunas, confirmar se você está contente com os tipos sugeridos, e caso não estiver, importar novamente especificando o argumento col_types como mostrado na Seção 20.2.3.

Outro desafio é quando você tem uma coluna na planilha do Excel que tem uma mistura de diferentes tipos: algumas células são numéricas, outras contém texto, outras contém datas. Quando importamos esses dados para o R, o readxl deve tomar algumas decisões. Nestes casos, você pode definir o tipo para esta coluna como "list", o qual importará a coluna como uma lista de vetores de tamanho 1, onde o tipo de cada elemento do vetor é sugerido.

Algumas vezes os dados são armazenados de forma mais exótica, como cores de fundo da célula, ou com texto em negrito ou não. Nestes casos, você pode achar útil o pacote tidyxl. Veja https://nacnudus.github.io/spreadsheet-munging-strategies/ para mais estratégias de trabalho com dados não tabulares vindos do Excel.

20.2.7 Exportando para Excel

Vamos criar um pequeno conjunto de dados (tibble) que iremos exportar. Note que item é um fator (factor) e quantidade é um inteiro (integer).

doces_vendas <- tibble(
  item     = factor(c("brownie", "cupcake", "cookie")),
  quantidade = c(10, 5, 8)
)

doces_vendas
#> # A tibble: 3 × 2
#>   item    quantidade
#>   <fct>        <dbl>
#> 1 brownie         10
#> 2 cupcake          5
#> 3 cookie           8

Você pode gravar estes dados em disco como um arquivo do Excel usando a função write_xlsx() do pacote writexl package:

write_xlsx(doces_vendas, path = "data/doces-vendas.xlsx")

A Figura 20.4 mostra como os dados aparecem no Excel. Note que os nomes das colunas também aparecem em negrito. Isto pode ser modificado definindo como FALSE os argumentos col_names e format_headers.

Conjunto de dados doces_vendas criado anteriormente mostrados no Excel.
Figura 20.4: Arquivo Excel chamado doces-vendas.xlsx.

Assim como acontece quando importamos dados de um CSV, as informações sobre os tipos de dados são perdidas quando importamos os dados novamente. Isto torna os arquivos do Excel uma fonte não confiável para armazenar resultados parciais. Para alternativas, veja Seção 7.5.

read_excel("data/doces-vendas.xlsx")
#> # A tibble: 3 × 2
#>   item    quantidade
#>   <chr>        <dbl>
#> 1 brownie         10
#> 2 cupcake          5
#> 3 cookie           8

20.2.8 Saídas formatadas

O pacote writexl é uma solução simplificada para criar uma simples planilha do Excel, mas se você estiver interessado em características adicionais como escrever em uma planilha dentro de um arquivo e estilizá-la, você pode querer utilizar o pacote openxlsx. Não entraremos nos detalhes deste pacote aqui, mas recomendamos ler https://ycphs.github.io/openxlsx/articles/Formatting.html para uma extensa discussão sobre outras funcionalidades de formatação de dados do R para o Excel usando o openxlsx.

Observe que este pacote não faz parte do tidyverse, portanto as funções e fluxos de trabalho podem não ser familiares. Por exemplo, os nomes das funções usam camelCase, várias funções não podem compor um pipeline, e os argumentos tendem a seguir ordens diferentes daquelas do tidyverse. Entretanto, tudo bem. Conforme seu aprendizado e uso do R expandem para além deste livro, você encontrará vários outros estilos em diversos pacotes disponíveis para atingir seus objetivos específicos no R. Uma boa forma de se familiarizar com o estilo de código em um novo pacote é executar alguns exemplos fornecidos na documentação das funções, sentir a sintaxe e formatos de saída, assim como ler qualquer vignette que acompanha o pacote.

20.2.9 Exercícios

  1. Em um arquivo do Excel, crie o seguinte conjunto de dados e salve como pesquisa.xlsx. Alternativamente, você pode baixar aqui como arquivo do Excel.

    Uma planilha com 2 colunas (pesquisa_id e n_animais_estimacao) e 7 linhas. A primeira linha possui os nomes das colunas. A coluna pesquisa_id possui números de 1 até 6. A coluna n_animais_estimacao, possui valores entre 0 e 2, contendo dois valores em texto (N/A e two).

    Depois, importe para o R tendo pesquisa_id como uma variável texto e n_animais_estimacao como uma variável numérica.

    #> # A tibble: 6 × 2
    #>   pesquisa_id n_animais_estimacao
    #>   <chr>                     <dbl>
    #> 1 1                             0
    #> 2 2                             1
    #> 3 3                            NA
    #> 4 4                             2
    #> 5 5                             2
    #> 6 6                            NA
  2. Em outro arquivo do Excel, crie o seguinte conjunto de dados e salve como lista.xlsx. Alternativamente, você pode baixar aqui como arquivo do Excel.

    Uma planilha com 3 colunas (grupo, subgrupo, e id) e 12 linhas. A coluna grupo contém dois valores: 1 (combinando 7 linhas juntas) e 2 (combinando 5 linhas juntas). A coluna subgrupo tem quatro valores: A (combinando 3 linhas juntas), B (combinando 4 linhas juntas), A (combinando 2 linhas juntas), e B (combinando 3 linhas juntas). A coluna id tem doze valores, números de 1 até 12.

    Depois, importe-o para o R. O conjunto de dados resultante deve ser nomeado como lista e deve se parecer com o que é mostrado a seguir.

    #> # A tibble: 12 × 3
    #>    grupo subgrupo    id
    #>    <dbl> <chr>    <dbl>
    #>  1     1 A            1
    #>  2     1 A            2
    #>  3     1 A            3
    #>  4     1 B            4
    #>  5     1 B            5
    #>  6     1 B            6
    #>  7     1 B            7
    #>  8     2 A            8
    #>  9     2 A            9
    #> 10     2 B           10
    #> 11     2 B           11
    #> 12     2 B           12
  3. Em um novo arquivo do Excel, crie o seguinte conjunto de dados e salve como vendas.xlsx. Alternativamente, você pode baixar aqui como arquivo do Excel.

    Uma planilha com 2 colunas e 13 linhas. As primeiras duas linhas tem um texto contendo informações sobre a planilha. A linha 1 diz "Este arquivo contém informações de vendas". A linha 2 diz "Dados estão organizados por nome da marca e para cada marca, temos um número ID para cada item vendido e quantos foram vendidos.". Depois existem duas linhas em branco seguidas por 9 linhas de dados.

    a. Importar vendas.xlsx e salvar como vendas. O conjunto de dados deve se parecer com o que é mostrado a seguir, com id e n como nomes das colunas e com 9 linhas.

    #> # A tibble: 9 × 2
    #>   id      n    
    #>   <chr>   <chr>
    #> 1 Marca 1 n    
    #> 2 1234    8    
    #> 3 8721    2    
    #> 4 1822    3    
    #> 5 Marca 2 n    
    #> 6 3333    1    
    #> 7 2156    3    
    #> 8 3987    6    
    #> 9 3216    5

    b. Modifique vendas de forma a ficar organizado (tidy) com três colunas (marca, id, e n) e 7 linhas de dados. Note que id e n são numéricas, marca é uma variável texto (ou caractere).

    #> # A tibble: 7 × 3
    #>   marca      id     n
    #>   <chr>   <dbl> <dbl>
    #> 1 Marca 1  1234     8
    #> 2 Marca 1  8721     2
    #> 3 Marca 1  1822     3
    #> 4 Marca 2  3333     1
    #> 5 Marca 2  2156     3
    #> 6 Marca 2  3987     6
    #> 7 Marca 2  3216     5
  4. Recrie o conjunto de dados doces_vendas, exporte para um arquivo do Excel usando a função write.xlsx() do pacote openxlsx.

  5. No Capítulo 7 você aprendeu sobre a função janitor::clean_names() para transformar os nomes das colunas em snake case. Importe o arquivo estudantes.xlsx que foi introduzido anteriormente nesta seção e use a função para “limpar” os nomes das colunas.

  6. O que acontece se você tentar importar um arquivo com a extensão .xlsx com read_xls()?

20.3 Planilhas Google (Google Sheets)

O Planilhas Google (Google Sheets) é um outro programa de planilha amplamente utilizado. É gratuito e acessado via navegador (web-based). Assim como o Excel, no Planilhas Google, os dados são armazenados em planilhas dentro de um arquivo.

20.3.1 Pré-requisitos

Esta seção também será focada em planilhas, mas desta vez você irá carregar os dados do Planilhas Google com o pacote googlesheets4. Este pacote também faz parte dos componentes secundários (non-core) do tidyverse, portanto devemos carregá-lo explicitamente.

Uma breve nota sobre o nome do pacote: googlesheets4 usa a versão 4 da API do Planilhas Google para fornecer uma interface do Planilhas Google para o R, por isso este nome.

20.3.2 Iniciando

A principal função do pacote googlesheets4 é a read_sheet(), a qual importa uma planilha do Google a partir de uma URL ou id do arquivo. Esta função também pode ser chamada pelo nome de range_read().

Você também pode criar uma nova planilha com a gs4_create() ou escrever em uma planilha já existente com a sheet_write() e semelhantes.

Nesta seção trabalharemos com os mesmos conjuntos de dados utilizados na seção sobre arquivos do Excel para destacar semelhanças e diferenças entre o fluxo de trabalho de importação de dados do Excel e do Planilhas Google. Os pacotes readxl e googlesheets4 foram desenhados para terem funcionalidades semelhantes ao pacote readr, o qual fornece a função read_csv() que você viu no Capítulo 7. Existem muitas tarefas que podem ser realizadas apenas trocando read_excel() por read_sheet(). Entretanto, você verá que o Excel e o Planilhas Google não se comportam extamente da mesma maneira, por isso, algumas chamadas de funções podem ser diferentes.

20.3.3 Importando do Planilhas Google

A Figura 20.5 mostra como é a planilha do Google que iremos importar para o R. Este é o mesmo conjunto de dados da Figura 20.1, exceto que está armazenado no Planilhas Google ao invés do Excel.

Uma visão da planilha estudantes no Planilhas Google. A planilha contém informações de 6 estudantes, seus IDs, nomes completos, comida favorita, plano alimentar e idade.
Figura 20.5: Planilha do Google chamada estudantes em uma janela do navegador.

O primeiro argumento da read_sheet() é a URL do arquivo a ser importado, e a função retorna um tibble:
https://docs.google.com/spreadsheets/d/1V1nPp1tzOuutXFLb3G9Eyxi3qxeEhnOXUzL5_BcCQ0w. Estas URLs não são fáceis de se trabalhar, portanto frequentemente você irá preferir identificar uma planilha através do seu ID.

estudantes_planilha_id <- "1V1nPp1tzOuutXFLb3G9Eyxi3qxeEhnOXUzL5_BcCQ0w"
estudantes <- read_sheet(estudantes_planilha_id)
#> ✔ Reading from students.
#> ✔ Range Sheet1.
estudantes
#> # A tibble: 6 × 5
#>   `Student ID` `Full Name`      favourite.food     mealPlan            AGE   
#>          <dbl> <chr>            <chr>              <chr>               <list>
#> 1            1 Sunil Huffmann   Strawberry yoghurt Lunch only          <dbl> 
#> 2            2 Barclay Lynn     French fries       Lunch only          <dbl> 
#> 3            3 Jayendra Lyne    N/A                Breakfast and lunch <dbl> 
#> 4            4 Leon Rossini     Anchovies          Lunch only          <NULL>
#> 5            5 Chidiegwu Dunkel Pizza              Breakfast and lunch <chr> 
#> 6            6 Güvenç Attila    Ice cream          Lunch only          <dbl>

Assim como fizemos na read_excel(), você pode fornecer nomes para as colunas, strings de valores não disponíveis (NA) e os tipos das colunas para a read_sheet().

estudantes <- read_sheet(
  estudantes_planilha_id,
  col_names = c("estudante_id", "nome_completo", "comida_favorita", "refeicao_plano", "idade"),
  skip = 1,
  na = c("", "N/A"),
  col_types = "dcccc"
)
#> ✔ Reading from students.
#> ✔ Range 2:10000000.

estudantes
#> # A tibble: 6 × 5
#>   estudante_id nome_completo    comida_favorita    refeicao_plano      idade
#>          <dbl> <chr>            <chr>              <chr>               <chr>
#> 1            1 Sunil Huffmann   Strawberry yoghurt Lunch only          4    
#> 2            2 Barclay Lynn     French fries       Lunch only          5    
#> 3            3 Jayendra Lyne    <NA>               Breakfast and lunch 7    
#> 4            4 Leon Rossini     Anchovies          Lunch only          <NA> 
#> 5            5 Chidiegwu Dunkel Pizza              Breakfast and lunch five 
#> 6            6 Güvenç Attila    Ice cream          Lunch only          6

Note que definimos os tipos das colunas de uma forma um pouco diferente aqui, usando códigos abreviados. Por exemplo, “dcccc” significa “double, character, character, character, character”.

Também é possível importar planilhas individuais do Planilhas Google. Para importar somente a planilha “Ilha Torgersen” da Planilha Pinguins do Planilhas Google:

pinguins_planilha_id <- "1aFu8lnD_g0yjF5O-K6SFgSEWiHPpgvFCF0NY9D6LXnY"
read_sheet(pinguins_planilha_id, sheet = "Torgersen Island")
#> ✔ Reading from penguins.
#> ✔ Range ''Torgersen Island''.
#> # A tibble: 52 × 8
#>   species island    bill_length_mm bill_depth_mm flipper_length_mm
#>   <chr>   <chr>     <list>         <list>        <list>           
#> 1 Adelie  Torgersen <dbl [1]>      <dbl [1]>     <dbl [1]>        
#> 2 Adelie  Torgersen <dbl [1]>      <dbl [1]>     <dbl [1]>        
#> 3 Adelie  Torgersen <dbl [1]>      <dbl [1]>     <dbl [1]>        
#> 4 Adelie  Torgersen <chr [1]>      <chr [1]>     <chr [1]>        
#> 5 Adelie  Torgersen <dbl [1]>      <dbl [1]>     <dbl [1]>        
#> 6 Adelie  Torgersen <dbl [1]>      <dbl [1]>     <dbl [1]>        
#> # ℹ 46 more rows
#> # ℹ 3 more variables: body_mass_g <list>, sex <chr>, year <dbl>

Você pode obter todos os nomes de planilhas de dentro de um arquivo do Planilhas Google com sheet_names():

sheet_names(pinguins_planilha_id)
#> [1] "Torgersen Island" "Biscoe Island"    "Dream Island"

Finalmente, assim como na read_excel(), podemos importar um intervalo de uma planilha definindo o argumento range na função read_sheet(). Observe que também estamos utilizando a função gs4_example() para localizar a planilha de exemplo que vem junto com o pacote googlesheets4.

obitos_url <- gs4_example("deaths")
obitos <- read_sheet(obitos_url, range = "A5:F15")
#> ✔ Reading from deaths.
#> ✔ Range A5:F15.
obitos
#> # A tibble: 10 × 6
#>   Name          Profession   Age `Has kids` `Date of birth`    
#>   <chr>         <chr>      <dbl> <lgl>      <dttm>             
#> 1 David Bowie   musician      69 TRUE       1947-01-08 00:00:00
#> 2 Carrie Fisher actor         60 TRUE       1956-10-21 00:00:00
#> 3 Chuck Berry   musician      90 TRUE       1926-10-18 00:00:00
#> 4 Bill Paxton   actor         61 TRUE       1955-05-17 00:00:00
#> 5 Prince        musician      57 TRUE       1958-06-07 00:00:00
#> 6 Alan Rickman  actor         69 FALSE      1946-02-21 00:00:00
#> # ℹ 4 more rows
#> # ℹ 1 more variable: `Date of death` <dttm>

20.3.4 Exportando para o Planilhas Google

Você pode exportar dados do R para o Planilhas Google com a função write_sheet(). O primeiro argumento é o conjuntos de dados a ser exportado, o segundo argumento é o nome (ou outro identificador) da planilha a ser gravado no Planilhas Google:

write_sheet(doces_vendas, ss = "doces-vendas")

Se você quiser exportar para uma planilha específica dentro de um arquivo do Planilhas Google, você poderá fazê-lo especificando o argumento sheet também.

write_sheet(doces_vendas, ss = "doces-vendas", sheet = "Vendas")

20.3.5 Autenticação

Apesar de você poder importar uma planilha pública com sua conta do Google e a função gs4_deauth(), importar uma planilha privada ou exportar para uma requer autenticação para que o pacote googlesheets4 possa acessar e gerenciar suas Planilhas Google.

Quando você tenta acessar uma planilha que requer autenticação, o googlesheets4 irá te redirecionar para um navegador web e pedir sua conta do Google para obter a permissão de operar as planilhas em seu lugar. Entretanto, se você quiser definir uma conta específica, escopo de autenticação, etc, você pode fazer através da gs4_auth(), ex: gs4_auth(email = "meu@exemplo.com"), o qual irá forçar o uso de um token associado a este email específico. Para mais informações sobre autenticação, recomendamos ler a documentação do googlesheets4 (auth vignette) em https://googlesheets4.tidyverse.org/articles/auth.html.

20.3.6 Exercícios

  1. Importe o conjunto de dados estudantes visto anteriormente neste capítulo do Excel e do Planilhas Google, sem argumentos adicionais usando as funções read_excel() e read_sheet(). Os data frames resultantes são idênticos no R? Se não, quais as diferenças?

  2. Importe a planilha chamada pesquisa do Planilhas Google de https://pos.it/r4ds-survey, tendo pesquisa_id como uma variável texto (caractere) e n_animais_estimacao como numérica.

  3. Importe do Planilhas Google o arquivo chamado lista de https://pos.it/r4ds-roster. O data frame resultante deve se chamar lista e deve se parecer como mostrado abaixo.

    #> # A tibble: 12 × 3
    #>    group subgroup    id
    #>    <dbl> <chr>    <dbl>
    #>  1     1 A            1
    #>  2     1 A            2
    #>  3     1 A            3
    #>  4     1 B            4
    #>  5     1 B            5
    #>  6     1 B            6
    #>  7     1 B            7
    #>  8     2 A            8
    #>  9     2 A            9
    #> 10     2 B           10
    #> 11     2 B           11
    #> 12     2 B           12

20.4 Resumo

O Microsoft Excel e o Planilhas Google são dois sistemas de planilhas muito populares. Ser capaz de interagir com dados armazenados no Excel e Planilhas Google diretamente do R é um superpoder! Neste capítulo você aprendeu a importar dados para o R de planilhas do Excel usando a read_excel() do pacote readxl e do Planilhas Google usando a read_sheet() do pacote googlesheets4. Estas funções trabalham de forma muito parecidas e possuem argumentos similares para especificar nomes de colunas, valores não disponíveis (NA), pular linhas no início do arquivo que está importando, etc. Além disso, ambas funções permitem ler planilhas específicas de dentro dos respectivos arquivos.

Por outro lado, exportar para o Excel requer um pacote e função diferente (writexl::write_xlsx()) enquanto você pode exportar para o Planilhas Google com o mesmo pacote googlesheets4, com a função write_sheet().

No próximo capítulo, você aprenderá sobre uma fonte de dados diferente e como importar dados desta fonte para o R: banco de dados (databases).