Aula 6 – Manipulação de dados com dplyr, tidyr e introdução ao ggplot2

Autor

Prof. Marcelo Ribeiro

Objetivo da Aula

Compreender e aplicar, com os pacotes dplyr e tidyr, operações essenciais de manipulação de dados, incluindo classificação de casos, junção, agregação, divisão, seleção, recodificação e criação de novas variáveis, além de introduzir a construção de gráficos com ggplot2 e seus principais parâmetros.

Comentário do professor

Nesta aula, retomaremos os mesmos tópicos centrais da aula anterior, mas agora utilizando a sintaxe do tidyverse, especialmente os pacotes dplyr e tidyr. O objetivo é mostrar aos alunos uma forma mais fluida, legível e profissional de manipulação de dados em R.

1. Introdução

Nas aulas anteriores, estudamos a lógica das principais operações de manipulação de dados utilizando estruturas do R base. Agora avançaremos para uma abordagem muito utilizada em Estatística, Ciência de Dados e análise aplicada: a gramática de manipulação do tidyverse.

De modo geral, essa abordagem organiza o trabalho com dados por meio de funções com papéis bem definidos, como:

  • selecionar colunas;
  • filtrar linhas;
  • criar ou transformar variáveis;
  • agrupar casos;
  • resumir informações;
  • juntar bases;
  • reorganizar a estrutura de um conjunto de dados;
  • e construir gráficos de forma declarativa.
Comentário do professor

A principal vantagem didática do tidyverse é que ele separa as tarefas analíticas em verbos consistentes. Isso torna o código mais legível, mais previsível e mais fácil de encadear.

2. Carregando os pacotes

library(dplyr)
Warning: package 'dplyr' was built under R version 4.4.3

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(tidyr)
Warning: package 'tidyr' was built under R version 4.4.3
library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.4.3
Comentário do professor

A função library() carrega um pacote já instalado no R. - dplyr: manipulação de dados; - tidyr: reorganização de bases em formato tidy; - ggplot2: construção de gráficos.

3. Conjunto de dados da aula

Utilizaremos um conjunto de dados sintético em contexto compatível com o curso de Estatística e Ciência de Dados.

dados <- tibble(
  id = 1:12,
  nome = c("Ana", "Bruno", "Carla", "Daniel", "Eva", "Felipe",
           "Giovana", "Heitor", "Isabela", "Joao", "Karen", "Lucas"),
  turma = c("A", "A", "B", "B", "A", "B", "A", "B", "A", "B", "A", "B"),
  linguagem = c("R", "Python", "R", "Python", "R", "Python",
                "Python", "R", "R", "Python", "R", "Python"),
  horas_estudo = c(12, 8, 15, 7, 11, 9, 6, 14, 13, 10, 16, 5),
  projetos = c(3, 1, 4, 1, 2, 2, 1, 5, 4, 3, 5, 1),
  nota_r = c(8.7, 6.1, 9.2, 5.8, 7.5, 6.9, 5.4, 9.5, 8.8, 7.2, 9.7, 4.9),
  frequencia = c(92, 85, 97, 78, 88, 83, 75, 99, 94, 86, 98, 72)
)

dados
Comentário do professor

A função tibble() cria uma tabela moderna do tidyverse. Conceitualmente, ela é semelhante a um data.frame, mas possui impressão mais organizada e comportamento mais consistente em várias operações de manipulação.

4. Selecionar casos e variáveis com dplyr

No tidyverse, duas funções centrais para esse tipo de tarefa são:

  • select() para colunas;
  • filter() para linhas.

4.1 Selecionando variáveis com select()

Execute este código
dados %>%
  select(nome, turma, nota_r, projetos)
Comentário do professor

A função select() seleciona colunas. - seus argumentos correspondem aos nomes das variáveis que desejamos manter; - o operador %>% encaminha o resultado de uma etapa para a próxima.

4.2 Selecionando casos com filter()

Execute este código
dados %>%
  filter(nota_r >= 8)
Comentário do professor

A função filter() seleciona linhas com base em condições lógicas. Neste exemplo, permanecem apenas os casos com nota_r >= 8.

4.3 Combinando filter() e select()

Execute este código
dados %>%
  filter(frequencia >= 90, projetos >= 3) %>%
  select(nome, turma, frequencia, projetos, nota_r)
Comentário do professor

Dentro de filter(), múltiplas condições separadas por vírgula são interpretadas como conjunção lógica, isto é, como se estivéssemos usando “e”.

Ilustração 4.1 – Fluxo de seleção com dplyr

flowchart LR
A["Base original"] --> B["filter()"]
B --> C["select()"]
C --> D["Subconjunto final"]

5. Classificar casos e recodificar valores com mutate() e case_when()

Uma das tarefas mais importantes em análise de dados é criar classificações e recodificações com base em regras analíticas.

5.1 Criando uma classificação com mutate() e case_when()

Execute este código
dados_classificados <- dados %>%
  mutate(
    desempenho = case_when(
      nota_r < 6 ~ "baixo",
      nota_r < 8 ~ "intermediario",
      TRUE ~ "alto"
    )
  )

dados_classificados %>%
  select(nome, nota_r, desempenho)
Comentário do professor

A função mutate() cria ou modifica colunas. A função case_when() permite definir regras condicionais de forma mais legível do que vários ifelse() aninhados. - cada linha de regra tem a forma condição ~ resultado; - TRUE ~ ... funciona como caso final padrão.

5.2 Classificação por múltiplos critérios

Execute este código
dados_classificados <- dados %>%
  mutate(
    perfil = case_when(
      nota_r >= 9 & projetos >= 4 ~ "excelente",
      nota_r >= 7.5 & frequencia >= 85 ~ "bom",
      nota_r >= 6 ~ "regular",
      TRUE ~ "insuficiente"
    )
  )

dados_classificados %>%
  select(nome, nota_r, projetos, frequencia, perfil)

5.3 Recodificando uma variável em faixas

Execute este código
dados_recodificados <- dados %>%
  mutate(
    faixa_estudo = case_when(
      horas_estudo < 8 ~ "baixa",
      horas_estudo < 12 ~ "media",
      TRUE ~ "alta"
    )
  )

dados_recodificados %>%
  select(nome, horas_estudo, faixa_estudo)

Ilustração 5.1 – Classificação e recodificação

flowchart LR
A["Variável original"] --> B["mutate() + case_when()"]
B --> C["Nova variável categórica"]

Ideia central

No tidyverse, a classificação de casos e a recodificação de valores costumam ser feitas com mutate(), pois essa função concentra a lógica de criação e transformação de colunas.

6. Calcular novas variáveis com mutate()

Criar variáveis derivadas é uma etapa central no fluxo de análise.

6.1 Criando um escore simples

Execute este código
dados_score <- dados %>%
  mutate(
    score = nota_r + 0.5 * projetos
  )

dados_score %>%
  select(nome, nota_r, projetos, score)

6.2 Criando uma medida relativa

Execute este código
dados_eficiencia <- dados %>%
  mutate(
    eficiencia = nota_r / horas_estudo
  )

dados_eficiencia %>%
  select(nome, nota_r, horas_estudo, eficiencia)

6.3 Criando várias variáveis em uma única etapa

Execute este código
dados_novos <- dados %>%
  mutate(
    score = nota_r + 0.5 * projetos,
    eficiencia = nota_r / horas_estudo,
    alto_desempenho = nota_r >= 8
  )

dados_novos %>%
  select(nome, score, eficiencia, alto_desempenho)
Comentário do professor

Uma grande vantagem de mutate() é permitir criar diversas variáveis novas em uma única chamada, mantendo a leitura do código bastante organizada.

7. Agregar casos com group_by() e summarise()

A agregação no tidyverse é, em geral, construída em duas etapas:

  1. definir os grupos com group_by();
  2. resumir os dados com summarise().

7.1 Média da nota por turma

Execute este código
dados %>%
  group_by(turma) %>%
  summarise(
    media_nota = mean(nota_r)
  )
Comentário do professor

A função group_by() declara a variável de agrupamento.
A função summarise() reduz cada grupo a uma ou mais medidas resumo.

7.2 Resumindo várias medidas ao mesmo tempo

Execute este código
dados %>%
  group_by(turma) %>%
  summarise(
    media_nota = mean(nota_r),
    media_estudo = mean(horas_estudo),
    total_projetos = sum(projetos)
  )

7.3 Agregando por mais de uma variável

Execute este código
dados %>%
  group_by(turma, linguagem) %>%
  summarise(
    media_nota = mean(nota_r),
    .groups = "drop"
  )
Comentário do professor

O argumento .groups = "drop" remove a estrutura de agrupamento após o resumo. Isso costuma ser útil para evitar efeitos inesperados em etapas posteriores.

Ilustração 7.1 – Agregação com grupos

flowchart LR
A["Base completa"] --> B["group_by()"]
B --> C["summarise()"]
C --> D["Tabela resumo por grupos"]

8. Dividir bases de dados com group_split()

Quando queremos separar a base em subconjuntos, uma opção elegante é group_split().

8.1 Separando a base por turma

Execute este código
bases_turma <- dados %>%
  group_by(turma) %>%
  group_split()

bases_turma
<list_of<
  tbl_df<
    id          : integer
    nome        : character
    turma       : character
    linguagem   : character
    horas_estudo: double
    projetos    : double
    nota_r      : double
    frequencia  : double
  >
>[2]>
[[1]]
# A tibble: 6 × 8
     id nome    turma linguagem horas_estudo projetos nota_r frequencia
  <int> <chr>   <chr> <chr>            <dbl>    <dbl>  <dbl>      <dbl>
1     1 Ana     A     R                   12        3    8.7         92
2     2 Bruno   A     Python               8        1    6.1         85
3     5 Eva     A     R                   11        2    7.5         88
4     7 Giovana A     Python               6        1    5.4         75
5     9 Isabela A     R                   13        4    8.8         94
6    11 Karen   A     R                   16        5    9.7         98

[[2]]
# A tibble: 6 × 8
     id nome   turma linguagem horas_estudo projetos nota_r frequencia
  <int> <chr>  <chr> <chr>            <dbl>    <dbl>  <dbl>      <dbl>
1     3 Carla  B     R                   15        4    9.2         97
2     4 Daniel B     Python               7        1    5.8         78
3     6 Felipe B     Python               9        2    6.9         83
4     8 Heitor B     R                   14        5    9.5         99
5    10 Joao   B     Python              10        3    7.2         86
6    12 Lucas  B     Python               5        1    4.9         72
Comentário do professor

A função group_split() divide uma base em uma lista de subconjuntos, respeitando os grupos definidos previamente por group_by().

8.2 Separando por linguagem

Execute este código
bases_linguagem <- dados %>%
  group_by(linguagem) %>%
  group_split()

bases_linguagem
<list_of<
  tbl_df<
    id          : integer
    nome        : character
    turma       : character
    linguagem   : character
    horas_estudo: double
    projetos    : double
    nota_r      : double
    frequencia  : double
  >
>[2]>
[[1]]
# A tibble: 6 × 8
     id nome    turma linguagem horas_estudo projetos nota_r frequencia
  <int> <chr>   <chr> <chr>            <dbl>    <dbl>  <dbl>      <dbl>
1     2 Bruno   A     Python               8        1    6.1         85
2     4 Daniel  B     Python               7        1    5.8         78
3     6 Felipe  B     Python               9        2    6.9         83
4     7 Giovana A     Python               6        1    5.4         75
5    10 Joao    B     Python              10        3    7.2         86
6    12 Lucas   B     Python               5        1    4.9         72

[[2]]
# A tibble: 6 × 8
     id nome    turma linguagem horas_estudo projetos nota_r frequencia
  <int> <chr>   <chr> <chr>            <dbl>    <dbl>  <dbl>      <dbl>
1     1 Ana     A     R                   12        3    8.7         92
2     3 Carla   B     R                   15        4    9.2         97
3     5 Eva     A     R                   11        2    7.5         88
4     8 Heitor  B     R                   14        5    9.5         99
5     9 Isabela A     R                   13        4    8.8         94
6    11 Karen   A     R                   16        5    9.7         98

8.3 Acessando um subconjunto específico

Execute este código
bases_linguagem[[1]]
Comentário do professor

Como o resultado de group_split() é uma lista, cada subconjunto pode ser acessado por índices com [[ ]].

9. Juntar casos ou variáveis com bind_*() e join()

9.1 Juntando casos com bind_rows()

Execute este código
novos_casos <- tibble(
  id = 13:15,
  nome = c("Marina", "Nicolas", "Olivia"),
  turma = c("C", "C", "C"),
  linguagem = c("R", "Python", "R"),
  horas_estudo = c(14, 9, 12),
  projetos = c(4, 2, 3),
  nota_r = c(9.0, 6.7, 8.4),
  frequencia = c(96, 84, 91)
)

dados_ampliados <- bind_rows(dados, novos_casos)

dados_ampliados
Comentário do professor

A função bind_rows() empilha tabelas por linhas. Ela é análoga à ideia de rbind(), mas se integra naturalmente ao fluxo tidyverse.

9.2 Juntando variáveis com bind_cols()

Execute este código
monitorias <- tibble(
  monitorias = c(2, 1, 3, 0, 1, 1, 0, 4, 2, 2, 3, 0)
)

dados_colunas <- bind_cols(dados, monitorias)

dados_colunas
Comentário do professor

A função bind_cols() junta objetos por colunas. Assim como no caso do R base, é preciso garantir compatibilidade entre o número e a ordem das observações.

9.3 Juntando bases por chave com left_join()

Agora vamos acrescentar informações externas à base principal.

Execute este código
dados_extra <- tibble(
  id = c(1, 3, 5, 7, 9, 11),
  bolsa = c("sim", "nao", "sim", "nao", "sim", "sim")
)

dados_join <- dados %>%
  left_join(dados_extra, by = "id")

dados_join
Comentário do professor

A função left_join(x, y, by) mantém todas as linhas da base x e adiciona as informações correspondentes de y, usando a variável-chave informada em by.

Ilustração 9.1 – Junção por chave

flowchart LR
A["Base principal"] --> C["left_join(by = 'id')"]
B["Base auxiliar"] --> C
C --> D["Base combinada"]

10. Reorganizar bases com tidyr

O pacote tidyr é especialmente importante quando precisamos mudar a estrutura de uma base, tornando-a mais apropriada para análise ou visualização.

10.1 Base em formato largo

avaliacoes <- tibble(
  id = 1:5,
  prova1 = c(7.5, 6.0, 8.2, 5.7, 9.1),
  prova2 = c(8.0, 6.5, 8.8, 6.1, 9.4),
  prova3 = c(8.4, 7.0, 9.0, 6.3, 9.5)
)

avaliacoes

10.2 Transformando de formato largo para longo com pivot_longer()

Execute este código
avaliacoes_long <- avaliacoes %>%
  pivot_longer(
    cols = starts_with("prova"),
    names_to = "avaliacao",
    values_to = "nota"
  )

avaliacoes_long
Comentário do professor

A função pivot_longer() aumenta o número de linhas e reduz o número de colunas. - cols: colunas que serão empilhadas; - names_to: nome da nova coluna que guardará os nomes das variáveis originais; - values_to: nome da nova coluna que guardará os valores.

10.3 Transformando de formato longo para largo com pivot_wider()

Execute este código
avaliacoes_wide <- avaliacoes_long %>%
  pivot_wider(
    names_from = avaliacao,
    values_from = nota
  )

avaliacoes_wide
Comentário do professor

A função pivot_wider() faz o caminho inverso: - names_from: coluna cujos valores serão transformados em nomes de colunas; - values_from: coluna que contém os valores a serem redistribuídos.

Ilustração 10.1 – Reorganização da base

flowchart LR
A["Formato largo"] --> B["pivot_longer()"]
B --> C["Formato longo"]
C --> D["pivot_wider()"]
D --> E["Formato largo novamente"]

Comentário do professor

Uma base em formato tidy favorece a manipulação com dplyr e a construção de gráficos com ggplot2. Por isso, reorganizar corretamente os dados costuma ser uma etapa essencial no fluxo analítico.

11. Introdução ao ggplot2

O ggplot2 organiza a construção de gráficos por camadas. Em termos gerais, um gráfico é construído a partir de:

  • uma base de dados;
  • um mapeamento estético com aes();
  • uma ou mais camadas geométricas;
  • elementos de rótulo e tema.

11.1 Estrutura geral do ggplot()

A forma mais básica é:

ggplot(dados, aes(x = variavel_x, y = variavel_y)) +
  geom_...( )
Comentário do professor

A função ggplot(data, aes(...)) inicializa o gráfico. - data: base de dados; - aes(): mapeamento entre variáveis e elementos visuais, como eixo x, eixo y, cor, forma ou preenchimento. Depois disso, adicionamos camadas com +.

11.2 Gráfico de dispersão com geom_point()

Execute este código
ggplot(dados, aes(x = horas_estudo, y = nota_r)) +
  geom_point()

11.3 Acrescentando parâmetros estéticos

Execute este código
ggplot(dados, aes(x = horas_estudo, y = nota_r)) +
  geom_point(color = "darkred", size = 3, alpha = 0.8)

Comentário do professor

Na camada geom_point(): - color: cor da borda/ponto; - size: tamanho dos pontos; - alpha: transparência.

11.4 Adicionando títulos e rótulos

Execute este código
ggplot(dados, aes(x = horas_estudo, y = nota_r)) +
  geom_point(color = "darkred", size = 3, alpha = 0.8) +
  labs(
    title = "Relação entre horas de estudo e nota em R",
    x = "Horas de estudo por semana",
    y = "Nota em R"
  )

Comentário do professor

A função labs() controla títulos e rótulos do gráfico: - title: título principal; - x: rótulo do eixo horizontal; - y: rótulo do eixo vertical; - também pode ser usada para nomear legendas, como color e fill.

11.5 Aplicando um tema

Execute este código
ggplot(dados, aes(x = horas_estudo, y = nota_r)) +
  geom_point(color = "darkred", size = 3, alpha = 0.8) +
  labs(
    title = "Relação entre horas de estudo e nota em R",
    x = "Horas de estudo por semana",
    y = "Nota em R"
  ) +
  theme_minimal()

Comentário do professor

As funções theme_*() controlam a aparência geral do gráfico.
theme_minimal() produz um gráfico com aparência limpa e bastante utilizada em relatórios e apresentações.

11.6 Gráfico de barras com geom_col()

Primeiro, vamos construir uma base resumo.

resumo_linguagem <- dados %>%
  group_by(linguagem) %>%
  summarise(
    media_nota = mean(nota_r),
    .groups = "drop"
  )

resumo_linguagem

Agora, o gráfico:

Execute este código
ggplot(resumo_linguagem, aes(x = linguagem, y = media_nota, fill = linguagem)) +
  geom_col() +
  labs(
    title = "Média da nota em R por linguagem preferida",
    x = "Linguagem",
    y = "Média da nota"
  ) +
  theme_minimal()

Comentário do professor

A função geom_col() constrói barras cujas alturas já estão previamente calculadas na base.
O argumento fill controla a cor de preenchimento das barras.

11.7 Histograma com geom_histogram()

Execute este código
ggplot(dados, aes(x = nota_r)) +
  geom_histogram(bins = 5, fill = "steelblue", color = "white") +
  labs(
    title = "Distribuição da nota em R",
    x = "Nota em R",
    y = "Frequência"
  ) +
  theme_minimal()

Comentário do professor

A função geom_histogram() constrói histogramas. - bins: número de classes; - fill: cor de preenchimento; - color: cor da borda.

11.8 Adicionando uma reta de tendência

Execute este código
ggplot(dados, aes(x = horas_estudo, y = nota_r)) +
  geom_point(color = "darkred", size = 3, alpha = 0.8) +
  geom_smooth(method = "lm", se = FALSE, color = "navy", linewidth = 1) +
  labs(
    title = "Relação entre horas de estudo e nota em R",
    x = "Horas de estudo por semana",
    y = "Nota em R"
  ) +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

Comentário do professor

A função geom_smooth() adiciona uma curva ou reta de tendência. - method = "lm": ajusta uma regressão linear; - se = FALSE: remove a faixa de confiança; - color: define a cor da linha; - linewidth: controla a espessura da linha.

Ilustração 11.1 – Lógica de construção do ggplot2

flowchart LR
A["Dados"] --> B["ggplot(data, aes(...))"]
B --> C["geom_*()"]
C --> D["labs()"]
D --> E["theme_*()"]

Ideia central

No ggplot2, um gráfico não é apenas “desenhado”; ele é construído por camadas. Quando o aluno compreende essa lógica, passa a ter muito mais autonomia para montar gráficos novos.

12. Integração entre dplyr, tidyr e ggplot2

Uma das grandes forças do tidyverse é a integração entre seus pacotes. Vamos ver um exemplo que combina transformação e visualização.

Execute este código
dados %>%
  mutate(
    faixa_estudo = case_when(
      horas_estudo < 8 ~ "baixa",
      horas_estudo < 12 ~ "media",
      TRUE ~ "alta"
    )
  ) %>%
  group_by(faixa_estudo) %>%
  summarise(
    media_nota = mean(nota_r),
    .groups = "drop"
  ) %>%
  ggplot(aes(x = faixa_estudo, y = media_nota, fill = faixa_estudo)) +
  geom_col() +
  labs(
    title = "Nota média por faixa de estudo",
    x = "Faixa de estudo",
    y = "Média da nota"
  ) +
  theme_minimal()

Comentário do professor

Este exemplo ilustra um fluxo muito comum em Ciência de Dados: - criar variáveis; - resumir por grupos; - e, imediatamente depois, representar os resultados em um gráfico.

13. Erros comuns e boas práticas

Erros comuns
  • usar select() achando que ele filtra linhas;
  • usar filter() achando que ele seleciona colunas;
  • esquecer de usar group_by() antes de summarise() quando o objetivo é resumir por grupos;
  • usar bind_cols() em objetos com observações desalinhadas;
  • usar pivot_longer() ou pivot_wider() sem compreender a estrutura original da base;
  • construir gráficos no ggplot2 sem compreender o papel de aes() e das camadas.
Boas práticas
  • escreva o código em etapas logicamente encadeadas;
  • dê nomes claros às variáveis criadas;
  • confira a estrutura da base após transformações importantes;
  • use select() e filter() de forma conceitualmente distinta;
  • ao construir gráficos, pense separadamente em dados, mapeamentos, geometrias, rótulos e tema.

14. Exercícios propostos

Exercício 1

Utilizando mutate() e case_when(), crie uma variável chamada perfil_academico segundo as regras:

  • "excelente" se nota_r >= 9 e projetos >= 4;
  • "bom" se nota_r >= 7.5 e frequencia >= 85;
  • "regular" se nota_r >= 6;
  • "insuficiente" caso contrário.

Apresente apenas as colunas:

  • nome
  • nota_r
  • projetos
  • frequencia
  • perfil_academico

Exercício 2

Selecione apenas os estudantes que satisfazem simultaneamente as condições:

  • turma == "A" ou linguagem == "R";
  • horas_estudo >= 10;
  • nota_r >= 7.

Em seguida, apresente somente as colunas:

  • nome
  • turma
  • linguagem
  • horas_estudo
  • nota_r

Exercício 3

Usando group_by() e summarise(), calcule por turma:

  • a média de nota_r;
  • a média de horas_estudo;
  • a soma de projetos.

Exercício 4

Divida a base segundo a variável linguagem com group_split() e calcule a média de nota_r apenas para o subconjunto dos estudantes que preferem Python.

Exercício 5

Crie uma nova variável chamada faixa_estudo com mutate() e case_when(), segundo as categorias:

  • "baixa" se horas_estudo < 8;
  • "media" se 8 <= horas_estudo < 12;
  • "alta" se horas_estudo >= 12.

Apresente apenas as colunas:

  • nome
  • horas_estudo
  • faixa_estudo

Exercício 6

Crie uma nova variável chamada indice_global, definida por

\[ \text{indice\_global}_i = 0.6 \times \text{nota\_r}_i + 0.2 \times \text{projetos}_i + 0.02 \times \text{frequencia}_i \]

Em seguida, ordene a base em ordem decrescente de indice_global e apresente apenas os 5 primeiros casos.

Exercício 7

Construa, com ggplot2, um gráfico de dispersão entre horas_estudo e nota_r, com:

  • título "Relação entre horas de estudo e nota em R";
  • rótulos adequados nos eixos;
  • pontos na cor "darkred";
  • tamanho size = 3;
  • transparência alpha = 0.8.

Depois, adicione a reta de regressão linear, na cor "navy" e com linewidth = 1.

Exercício 8

Crie uma tabela resumo com a média de nota_r por faixa_estudo e, em seguida, construa um gráfico de barras com:

  • geom_col();
  • título adequado;
  • categorias no eixo horizontal;
  • barras coloridas por grupo;
  • theme_minimal().

Exercício 9

Considere a base avaliacoes apresentada nesta aula. Reorganize-a com pivot_longer() para obter uma versão longa com as colunas:

  • id
  • avaliacao
  • nota

Exercício 10

Usando o objeto criado no exercício anterior, reconstrua a estrutura larga com pivot_wider().

Comentário do professor

Os exercícios desta aula foram pensados para consolidar o uso dos principais verbos do tidyverse, articulando manipulação, reorganização e visualização de dados em um mesmo fluxo analítico.