Aula 3 - Modificando Variáveis e Mudando a Forma dos Dados

1 Dando um Novo Sentido e Forma aos Dados

Seja bem-vindo a terceira aula do nosso minicurso de Fundamentos de Processamento de Dados Utilizando o Tidyverse!

Parabéns pela perseverança e vontade de aprender, e lembre-se, você já sabe mais do que na primeira aula !!

Arte de @allison_horst

Na aula de hoje, iremos:

  • Conhecer a função mutate para modificação de variáveis

  • Exemplificar como a função across auxilia o uso do mutate

  • Introduzir as funções de reestruturação de dados pivot_longer e pivot_wider

2 Modificando Variáveis

Na aula de hoje iremos ver uma das funções mais importantes durante o processo de manipulação de dados, o mutate

Ele tem como objetivo criar novas colunas ou alterar colunas já existentes

Arte de @allison_horst

Possui a seguinte sintaxe

# Criando nova variável
dados |>
  dplyr::mutate(nova_variável = função(variável_existente))
                
# Alterando variável já existente

dados |>
  dplyr::mutate(variável_existente = função(variável_existente))

2.1 Exemplos

2.1.1 Ações - GAFA

O seguinte conjunto de dados possui informações sobre ações das empresas: Google, Apple, Facebook e Amazon

tsibbledata::gafa_stock  |>
  rmarkdown::paged_table()

O volume de ações da Apple apresentou o seguinte comportamento

tsibbledata::gafa_stock |>
  dplyr::filter(Symbol == 'AAPL') |>
  autoplot(Volume)

  • Se desejássemos transformar a variável volume, podemos usar a função mutate
tsibbledata::gafa_stock |>
  janitor::clean_names() |>
  dplyr::filter(symbol == 'AAPL') |>
  dplyr::mutate(volume_trans = 1/(volume)) |>
  autoplot(volume_trans)

  • Se desejássemos modificar a data para o tipo ano - mês
tsibbledata::gafa_stock |>
  as_tibble() |>
  janitor::clean_names() |>
  dplyr::mutate(date = tsibble::yearweek(date))
# A tibble: 5,032 x 8
   symbol     date  open  high   low close adj_close    volume
   <chr>    <week> <dbl> <dbl> <dbl> <dbl>     <dbl>     <dbl>
 1 AAPL   2014 W01  79.4  79.6  78.9  79.0      67.0  58671200
 2 AAPL   2014 W01  79.0  79.1  77.2  77.3      65.5  98116900
 3 AAPL   2014 W02  76.8  78.1  76.2  77.7      65.9 103152700
 4 AAPL   2014 W02  77.8  78.0  76.8  77.1      65.4  79302300
 5 AAPL   2014 W02  77.0  77.9  77.0  77.6      65.8  64632400
 6 AAPL   2014 W02  78.1  78.1  76.5  76.6      65.0  69787200
 7 AAPL   2014 W02  77.1  77.3  75.9  76.1      64.5  76244000
 8 AAPL   2014 W03  75.7  77.5  75.7  76.5      64.9  94623200
 9 AAPL   2014 W03  76.9  78.1  76.8  78.1      66.1  83140400
10 AAPL   2014 W03  79.1  80.0  78.8  79.6      67.5  97909700
# i 5,022 more rows
## Pronto para um group_by
  • Se desejássemos extrair o ano e mês para novas variáveis distintas
tsibbledata::gafa_stock |>
  as_tibble() |>
  janitor::clean_names() |>
    dplyr::mutate(ano = lubridate::year(date),
                  mes = lubridate::month(date)) |>
  dplyr::filter(ano == 2014,
                symbol == 'AAPL')
# A tibble: 252 x 10
   symbol date        open  high   low close adj_close    volume   ano   mes
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>     <dbl> <dbl> <dbl>
 1 AAPL   2014-01-02  79.4  79.6  78.9  79.0      67.0  58671200  2014     1
 2 AAPL   2014-01-03  79.0  79.1  77.2  77.3      65.5  98116900  2014     1
 3 AAPL   2014-01-06  76.8  78.1  76.2  77.7      65.9 103152700  2014     1
 4 AAPL   2014-01-07  77.8  78.0  76.8  77.1      65.4  79302300  2014     1
 5 AAPL   2014-01-08  77.0  77.9  77.0  77.6      65.8  64632400  2014     1
 6 AAPL   2014-01-09  78.1  78.1  76.5  76.6      65.0  69787200  2014     1
 7 AAPL   2014-01-10  77.1  77.3  75.9  76.1      64.5  76244000  2014     1
 8 AAPL   2014-01-13  75.7  77.5  75.7  76.5      64.9  94623200  2014     1
 9 AAPL   2014-01-14  76.9  78.1  76.8  78.1      66.1  83140400  2014     1
10 AAPL   2014-01-15  79.1  80.0  78.8  79.6      67.5  97909700  2014     1
# i 242 more rows
  • Calculando a variação entre o preço na abertura x encerramento do dia
tsibbledata::gafa_stock |>
  janitor::clean_names() |>
  tibble::as_tibble() |>
  dplyr::mutate(variacao_dia = open - close, 
                .keep = 'unused') 
# A tibble: 5,032 x 7
   symbol date        high   low adj_close    volume variacao_dia
   <chr>  <date>     <dbl> <dbl>     <dbl>     <dbl>        <dbl>
 1 AAPL   2014-01-02  79.6  78.9      67.0  58671200        0.364
 2 AAPL   2014-01-03  79.1  77.2      65.5  98116900        1.70 
 3 AAPL   2014-01-06  78.1  76.2      65.9 103152700       -0.926
 4 AAPL   2014-01-07  78.0  76.8      65.4  79302300        0.611
 5 AAPL   2014-01-08  77.9  77.0      65.8  64632400       -0.664
 6 AAPL   2014-01-09  78.1  76.5      65.0  69787200        1.47 
 7 AAPL   2014-01-10  77.3  75.9      64.5  76244000        0.984
 8 AAPL   2014-01-13  77.5  75.7      64.9  94623200       -0.831
 9 AAPL   2014-01-14  78.1  76.8      66.1  83140400       -1.17 
10 AAPL   2014-01-15  80.0  78.8      67.5  97909700       -0.549
# i 5,022 more rows

2.2 Funções Auxiliares

2.2.1 dplyr::case_when()

A função case_when funciona como um if-else, porém sendo uma função vetorizada

Ela é chamada da seguinte forma

dados |>
  dplyr::mutate(
    nova_variável = 
      dplyr::case_when(
        valor_variavel % condição_1 ~ valor_a_receber_1,
        valor_variavel % condição_2 ~ valor_a_receber_2,
        ...,
        valor_variavel % condição_n ~ valor_a_receber_n
        )
    )

Voltando ao exemplo das ações

  • Classificando o volume de ações em: baixo, médio e alto
tsibbledata::gafa_stock |>
  tibble::as_tibble() |>
  janitor::clean_names() |>
  dplyr::filter(symbol == 'GOOG') |>
  dplyr::mutate(vol_pad = volume |> scale()) |>
  dplyr::mutate(
    cat_vol = 
      case_when(vol_pad <= -1 ~ 'baixo',
                vol_pad > -1 & vol_pad <=1 ~ 'medio',
                vol_pad > 1 ~ 'alto'
                )
    )
# A tibble: 1,258 x 10
   symbol date        open  high   low close adj_close  volume vol_pad[,1]
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>   <dbl>       <dbl>
 1 GOOG   2014-01-02  554.  555.  551.  553.      553. 3666400        1.56
 2 GOOG   2014-01-03  554.  555.  549.  549.      549. 3355000        1.28
 3 GOOG   2014-01-06  553.  556.  550.  555.      555. 3561600        1.46
 4 GOOG   2014-01-07  559.  566.  557.  566.      566. 5138400        2.87
 5 GOOG   2014-01-08  569.  570.  563.  567.      567. 4514100        2.31
 6 GOOG   2014-01-09  568.  568.  559.  561.      561. 4196000        2.03
 7 GOOG   2014-01-10  566.  566.  557.  561.      561. 4314700        2.13
 8 GOOG   2014-01-13  560.  570.  555.  558.      558. 4869100        2.63
 9 GOOG   2014-01-14  565.  572.  560.  571.      571. 4997400        2.74
10 GOOG   2014-01-15  573.  574.  568.  571.      571. 3925700        1.79
# i 1,248 more rows
# i 1 more variable: cat_vol <chr>

2.2.2 dplyr::across()

Aplicar uma função em 2 ou mais colunas em uma ‘tacada só’

Ela é chamada da seguinte forma

dados |>
  dplyr::mutate(
    dplyr::across(
      c(var1, var2), 
      ~função(.)
      )
    )

## OU

dados |>
  dplyr::mutate(
    dplyr::across(
      condição, 
      ~função(.)
      )
    )

Padronizando um vetor de variáveis

tsibbledata::gafa_stock |>
  tibble::as_tibble() |>
  janitor::clean_names() |>
  dplyr::mutate(
    dplyr::across(c(open:close), 
                  ~scale(.)
                  )
    )
# A tibble: 5,032 x 8
   symbol date       open[,1] high[,1] low[,1] close[,1] adj_close    volume
   <chr>  <date>        <dbl>    <dbl>   <dbl>     <dbl>     <dbl>     <dbl>
 1 AAPL   2014-01-02   -0.898   -0.899  -0.898    -0.899      67.0  58671200
 2 AAPL   2014-01-03   -0.899   -0.900  -0.902    -0.903      65.5  98116900
 3 AAPL   2014-01-06   -0.904   -0.902  -0.905    -0.902      65.9 103152700
 4 AAPL   2014-01-07   -0.902   -0.902  -0.903    -0.903      65.4  79302300
 5 AAPL   2014-01-08   -0.903   -0.902  -0.903    -0.902      65.8  64632400
 6 AAPL   2014-01-09   -0.901   -0.902  -0.904    -0.905      65.0  69787200
 7 AAPL   2014-01-10   -0.903   -0.904  -0.905    -0.906      64.5  76244000
 8 AAPL   2014-01-13   -0.906   -0.903  -0.906    -0.905      64.9  94623200
 9 AAPL   2014-01-14   -0.904   -0.902  -0.903    -0.901      66.1  83140400
10 AAPL   2014-01-15   -0.899   -0.898  -0.899    -0.898      67.5  97909700
# i 5,022 more rows

Padronizando todas as variáveis numéricas

tsibbledata::gafa_stock |>
  tibble::as_tibble() |>
  janitor::clean_names() |>
  dplyr::mutate(
    dplyr::across(is.numeric,
      ~scale(.)
      )
    )
# A tibble: 5,032 x 8
   symbol date       open[,1] high[,1] low[,1] close[,1] adj_close[,1]
   <chr>  <date>        <dbl>    <dbl>   <dbl>     <dbl>         <dbl>
 1 AAPL   2014-01-02   -0.898   -0.899  -0.898    -0.899        -0.922
 2 AAPL   2014-01-03   -0.899   -0.900  -0.902    -0.903        -0.925
 3 AAPL   2014-01-06   -0.904   -0.902  -0.905    -0.902        -0.924
 4 AAPL   2014-01-07   -0.902   -0.902  -0.903    -0.903        -0.925
 5 AAPL   2014-01-08   -0.903   -0.902  -0.903    -0.902        -0.925
 6 AAPL   2014-01-09   -0.901   -0.902  -0.904    -0.905        -0.926
 7 AAPL   2014-01-10   -0.903   -0.904  -0.905    -0.906        -0.927
 8 AAPL   2014-01-13   -0.906   -0.903  -0.906    -0.905        -0.927
 9 AAPL   2014-01-14   -0.904   -0.902  -0.903    -0.901        -0.924
10 AAPL   2014-01-15   -0.899   -0.898  -0.899    -0.898        -0.921
# i 5,022 more rows
# i 1 more variable: volume <dbl[,1]>

Criando a variável media_dia e observando sua relação com o volume de ações

tsibbledata::gafa_stock |>
  tibble::as_tibble()  |>
  janitor::clean_names() |>
  dplyr::filter(
    symbol == 'AAPL'
    ) |>
  rowwise() |>
  dplyr::mutate(
    media_dia = 
      mean(c(open:close))
    ) |>
  dplyr::select(date, volume, media_dia) |>
  tidyr::pivot_longer(-date) |>
  ggplot(aes(x = date, y = value)) +
  geom_line() +
  facet_grid('name', scales = 'free')

3 Pivotando

As funções tidyr::pivot_wider e tidyr::pivot_longer tem o objetivo mudar a forma que os dados estão dispostos em um tibble

Possuem a seguinte estrutura

  • pivot_longer
dados |>
  tidyr::pivot_longer(variáveis, 
                      names_to = 'variável_nomes', 
                      values_to = 'variável valores')
  • pivot_wider
dados |>
  tidyr::pivot_wider(variáveis, 
                      names_from = 'variável_nomes', 
                      values_from = 'variável valores')

Trabalhando da forma longa, seu conjunto de dados possue mais observações e e menos variáveis, enquanto que na forma ampla, ele possu mais variáveis e menos observações

3.1 Exemplos

3.1.1 Renda por religião

tidyr::relig_income |>
  rmarkdown::paged_table()
tidyr::relig_income |>
  tidyr::pivot_longer(-religion,
                      names_to = 'renda',
                      values_to = 'freq')
# A tibble: 180 x 3
   religion renda               freq
   <chr>    <chr>              <dbl>
 1 Agnostic <$10k                 27
 2 Agnostic $10-20k               34
 3 Agnostic $20-30k               60
 4 Agnostic $30-40k               81
 5 Agnostic $40-50k               76
 6 Agnostic $50-75k              137
 7 Agnostic $75-100k             122
 8 Agnostic $100-150k            109
 9 Agnostic >150k                 84
10 Agnostic Don't know/refused    96
# i 170 more rows

Voltando a forma original

tidyr::relig_income |>
  tidyr::pivot_longer(-religion,
                      names_to = 'renda',
                      values_to = 'freq') |>
  tidyr::pivot_wider(names_from = 'renda',
                     values_from = 'freq')
# A tibble: 18 x 11
   religion `<$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k` `$75-100k`
   <chr>      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>      <dbl>
 1 Agnostic      27        34        60        81        76       137        122
 2 Atheist       12        27        37        52        35        70         73
 3 Buddhist      27        21        30        34        33        58         62
 4 Catholic     418       617       732       670       638      1116        949
 5 Don’t k~      15        14        15        11        10        35         21
 6 Evangel~     575       869      1064       982       881      1486        949
 7 Hindu          1         9         7         9        11        34         47
 8 Histori~     228       244       236       238       197       223        131
 9 Jehovah~      20        27        24        24        21        30         15
10 Jewish        19        19        25        25        30        95         69
11 Mainlin~     289       495       619       655       651      1107        939
12 Mormon        29        40        48        51        56       112         85
13 Muslim         6         7         9        10         9        23         16
14 Orthodox      13        17        23        32        32        47         38
15 Other C~       9         7        11        13        13        14         18
16 Other F~      20        33        40        46        49        63         46
17 Other W~       5         2         3         4         2         7          3
18 Unaffil~     217       299       374       365       341       528        407
# i 3 more variables: `$100-150k` <dbl>, `>150k` <dbl>,
#   `Don't know/refused` <dbl>

4 SRAG - Datasus

Dados de casos de SRAGs em 2023 no Brasil

Nosso objetivo é limpar esse conjunto de dados, e decodificar cada variável

df_srag_pessoa = readr::read_csv2(here::here('./conjunto_de_dados/srag_2023.csv')) 

df_srag_pessoa = df_srag_pessoa |>
  select(CO_MUN_NOT, SG_UF, DT_NOTIFIC, CS_SEXO, NU_IDADE_N, FATOR_RISC, CLASSI_FIN, EVOLUCAO) |>
  rename(cod_mun = CO_MUN_NOT,
         uf = SG_UF, 
         data = DT_NOTIFIC, 
         sexo = CS_SEXO, 
         idade = NU_IDADE_N,
         comorbidade = FATOR_RISC,
         srag = CLASSI_FIN,
         obito = EVOLUCAO)
df_srag_pessoa = df_srag_pessoa |>
  mutate(
    data = 
      stringr::str_replace_all(data, '/', '-') |>
      lubridate::dmy(),
    cod_uf = cod_mun |>
      as.character() |>
      stringr::str_sub(1, 2) |>
      as.numeric()
    ) |>
  relocate(cod_uf, .before = uf) |>
  select(-uf) 


df_srag_pessoa = df_srag_pessoa |>
  mutate(
    comorbidade = 
      case_when(comorbidade == 1 ~ 1,
                comorbidade == 2 ~ 0,
                comorbidade == 9 ~ 0)
    ) |>
  mutate(influenza = NA,
         covid = NA,
         outros = NA) |>
  mutate(
    influenza = 
      case_when(srag == 1 ~ 1,
                .default = 0),
    covid = 
      case_when(srag == 5 ~ 1,
                .default = 0),
    outros = 
      case_when(srag == 2 | srag == 3 | srag == 4  ~ 1,
                .default = 0)
    ) |>
  mutate(
    obito = 
      case_when(obito == 1 | obito == 9 ~ 0,
                obito == 2 | obito == 3 ~ 1) 
    ) |>
  mutate(
    srag = 
      case_when(srag == NA ~ 0,
                .default = 1)
    ) |>
  tidyr::pivot_longer(c(influenza, covid, outros),
                      names_to = 'tipo_srag',
                      values_to = 'tipo_freq')

5 Desafio do Minicurso

5.1 Dados Tabnet/Datasus - Morbidade Hospitalar

Os dados foram retirados do Tabnet.

O conjunto de dados possui a ufs de referéncia, assim como o total de morbidade hospitalar

df_morbidade = readr::read_csv(here::here('./conjunto_de_dados/datasus.csv'),
                        n_max = 35,
                        locale = readr::locale(encoding = "latin1"))

df_morbidade
# A tibble: 35 x 7
   ...1                        ...2           ...3       ...4  ...5  ...6  ...7 
   <chr>                       <chr>          <chr>      <chr> <chr> <chr> <chr>
 1 <NA>                        <NA>           <NA>       <NA>  <NA>  <NA>  <NA> 
 2 Período:Ago/2023            <NA>           <NA>       <NA>  <NA>  <NA>  <NA> 
 3 Região/Unidade da Federação 1 Região Norte 2 Região ~ 3 Re~ 4 Re~ 5 Re~ Total
 4 Região Norte                2777           -          -     -     -     2777 
 5 .. Rondônia                 312            -          -     -     -     312  
 6 .. Acre                     161            -          -     -     -     161  
 7 .. Amazonas                 640            -          -     -     -     640  
 8 .. Roraima                  134            -          -     -     -     134  
 9 .. Pará                     1132           -          -     -     -     1132 
10 .. Amapá                    128            -          -     -     -     128  
# i 25 more rows
df_morbidade |>
  janitor::remove_empty(which = 'rows') |>
  janitor::row_to_names(2) |>
  dplyr::rename(ufs = 'Região/Unidade da Federação') |>
  dplyr::filter(!stringr::str_detect(ufs, 'Região')) |>
  tidyr::pivot_longer(-c(ufs, Total)) |>
  dplyr::filter(!stringr::str_detect(value, '-')) |>
  dplyr::select(-Total) |>
  dplyr::rename(regiao = name,
                casos = value) |>
  dplyr::mutate(ufs = ufs |>
                  stringr::str_replace_all("\\.{2} ", "") |>
                  tolower() |>
                  abjutils::rm_accent(),
                regiao = regiao |>
                  stringr::str_remove_all('\\d\\sRegião\\s') |>
                  tolower())
# A tibble: 27 x 3
   ufs       regiao   casos
   <chr>     <chr>    <chr>
 1 rondonia  norte    312  
 2 acre      norte    161  
 3 amazonas  norte    640  
 4 roraima   norte    134  
 5 para      norte    1132 
 6 amapa     norte    128  
 7 tocantins norte    270  
 8 maranhao  nordeste 1008 
 9 piaui     nordeste 714  
10 ceara     nordeste 1837 
# i 17 more rows

DESAFIO CONCLUIDO!!

5.2 Dados IBGE - Nascidos Vivos

O seguinte conjunto de dados foi retirado do site do IBGE

A tabela possui números de nascidos vivos por uf e por idade da mãe, além de números de subresgistros e subnotificações

Nosso objetivo é limpar o conjunto de dados, corrigindo nome de variáveis, seu tipo e corrigindo eventuais obstáculos das etapas de análise e modelagem

df_nasc_vivos = readxl::read_xlsx(here::here('./conjunto_de_dados/ibge.xlsx')) |>
  janitor::row_to_names(1) |>
  janitor::clean_names() |>
  dplyr::rename(cod_ibge = codigo_unidade_da_federacao_de_residencia_da_mae,
                uf = unidade_da_federacao_de_residencia_da_mae,
                idade = idade_da_mae_na_ocasiao_do_parto,
                nasc_vivo = total_estimado_de_nascidos_vivos,
                subres_nasc_vivo = sub_registro_de_nascidos_vivos_ibge_percent,
                subnot_nasc_vivos = subnotificacao_de_nascidos_vivos_ministerio_da_saude_percent)
df_nasc_vivos |>
  dplyr::filter(!cod_ibge == 99, 
                !is.na(uf)) |>
  dplyr::mutate(
    dplyr::across(
      c(nasc_vivo:subnot_nasc_vivos), 
      ~as.numeric(.)
      )
    ) |>
  dplyr::mutate(uf = uf |>
                  tolower() |>
                  abjutils::rm_accent())
# A tibble: 243 x 6
   cod_ibge uf       idade          nasc_vivo subres_nasc_vivo subnot_nasc_vivos
   <chr>    <chr>    <chr>              <dbl>            <dbl>             <dbl>
 1 11       rondonia Menos de 15 a~     226.            7.62              0.987 
 2 11       rondonia 15 a 19 anos      5517.            7.12              1.81  
 3 11       rondonia 20 a 24 anos      8180.            5.09              1.61  
 4 11       rondonia 25 a 29 anos      7108.            4.58              1.68  
 5 11       rondonia 30 a 34 anos      4845.            3.78              1.74  
 6 11       rondonia 35 a 39 anos      2054.            4.00              1.28  
 7 11       rondonia 40 a 44 anos       423.            5.50              1.72  
 8 11       rondonia 45 a 49 anos        24.0           4.29             12.6   
 9 11       rondonia 50 anos ou ma~       1             0.0571            0.0571
10 12       acre     Menos de 15 a~     312.           20.7               1.45  
# i 233 more rows

DESAFIO CONCLUIDO!!

5.3 Dados - PRF Sudeste

O seguinte conjunto de dados foi baixado no site do Detran, se tratando de acidentes de transito de 2023

O conjunto de dados possui observações do Brasil inteiro, nosso objetivo é limpar esse conjunto, filtrando apenas pelas observações da região Sudeste

library(rvest)

df_prf = readr::read_csv2(here::here('./conjunto_de_dados/datatran2023.csv'), 
                          locale = readr::locale(encoding = "latin1"))


df_prf |>
  head() |>
  rmarkdown::paged_table()
  • Construindo a tabela de estados
url = rvest::read_html('https://www.ibge.gov.br/explica/codigos-dos-municipios.php')

web_scrap_ufs = data.frame(
  ufs = url|>
      rvest::html_nodes('.uf td:nth-child(1) a')|>
      rvest::html_text(),
  cod_uf = url|>
      rvest::html_nodes('.numero a')|>
      rvest::html_text()
) |>
  dplyr::mutate(
    cod_uf = cod_uf |> 
      stringr::str_remove('ver municípios') |>
      as.numeric(),
    ufs = ufs |> 
      tolower() |>
      abjutils::rm_accent()
    
    )

web_scrap_ufs |> head()
       ufs cod_uf
1     acre     12
2  alagoas     27
3    amapa     16
4 amazonas     13
5    bahia     29
6    ceara     23

Construindo a tabela de municípios

web_scrap_mun = 
  data.frame(
    mun = url|>
      rvest::html_nodes('.municipio a')|>
      rvest::html_text() |>
      tolower() |>
      abjutils::rm_accent(),
    cod_mun = url |>
      rvest::html_nodes('.municipio .numero')|>
      rvest::html_text()
    ) |>
  dplyr::mutate(cod_uf = cod_mun |>
                  as.character() |>
                  stringr::str_sub(1, 2)) 

web_scrap_mun |> head()
              mun cod_mun cod_uf
1      acrelandia 1200013     12
2    assis brasil 1200054     12
3       brasileia 1200104     12
4          bujari 1200138     12
5        capixaba 1200179     12
6 cruzeiro do sul 1200203     12

Com as tabelas já construídas, podemos juntá-las, para isso, iremos utilizar função inner_join.

Veremos esses conceitos na próxima aula

6 Referências


Footer Image