R tip: criando tabelas com o pacote gt

Uso do pacote gt para formatar tabelas
Rstats
Author
Published

November 5, 2022

```{r setup}
#| warning: false
#| message: false

library(palmerpenguins)
library(tidyverse)
library(tidyselect)
library(gt)
```

Pinguins no formato padrão

Vamos começar com esta tabela do número de pinguins por espécie, sexo, ano e ilha.

```{r}
#| warning: false
#| message: false
#| fig-cap: "Quantidade de pinguins por espécie e sexo"
#| label: palmer

penguins_gt <- 
  penguins %>% 
  count(island, year, species, sex) %>% 
  filter(!is.na(sex)) %>% 
  pivot_wider(names_from = c(species, sex),
              values_from = n,
              names_glue = "{species} ({sex})",
              values_fill = 0) %>% 
  gt()

penguins_gt
```
island year Adelie (female) Adelie (male) Gentoo (female) Gentoo (male) Chinstrap (female) Chinstrap (male)
Biscoe 2007 5 5 16 17 0 0
Biscoe 2008 9 9 22 23 0 0
Biscoe 2009 8 8 20 21 0 0
Dream 2007 9 10 0 0 13 13
Dream 2008 8 8 0 0 9 9
Dream 2009 10 10 0 0 12 12
Torgersen 2007 8 7 0 0 0 0
Torgersen 2008 8 8 0 0 0 0
Torgersen 2009 8 8 0 0 0 0

Quantidade de pinguins por espécie e sexo

1. Retirar as linhas verticais

A formatação padrão do pacote gt() já elimina as linhas verticais, senão esta seria nossa primeira tarefa.

2. Alinhar os dados

Em tabelas o alinhamento deve considerar:

  • textos: alinhar à esquerda

  • números: alinhar à direita

```{r}
#| warning: false
#| message: false
#| fig-cap: "Quantidade de pinguins por espécie e sexo"
#| label: palmer2

penguins_gt <- 
  penguins_gt %>% 
  cols_align(align = "right", 
             columns = c(`Adelie (female)`, `Adelie (male)`,
                         `Gentoo (female)`, `Gentoo (male)`,
                         `Chinstrap (female)`, `Chinstrap (male)`))
penguins_gt
```
island year Adelie (female) Adelie (male) Gentoo (female) Gentoo (male) Chinstrap (female) Chinstrap (male)
Biscoe 2007 5 5 16 17 0 0
Biscoe 2008 9 9 22 23 0 0
Biscoe 2009 8 8 20 21 0 0
Dream 2007 9 10 0 0 13 13
Dream 2008 8 8 0 0 9 9
Dream 2009 10 10 0 0 12 12
Torgersen 2007 8 7 0 0 0 0
Torgersen 2008 8 8 0 0 0 0
Torgersen 2009 8 8 0 0 0 0

Quantidade de pinguins por espécie e sexo

3. Título para a tabela

Vamos acrescentar um título descrevendo as informações apresentadas.

```{r}
#| warning: false
#| message: false
#| fig-cap: "Quantidade de pinguins por espécie e sexo"
#| label: palmer3

penguins_gt <- 
  penguins_gt %>% 
  tab_header(title = "Pinguins no Arquipélago Palmer na Antártica",
             subtitle = "palmerpinguins in R dataset") %>% 
  opt_align_table_header(align = "left")

penguins_gt
```
Pinguins no Arquipélago Palmer na Antártica
palmerpinguins in R dataset
island year Adelie (female) Adelie (male) Gentoo (female) Gentoo (male) Chinstrap (female) Chinstrap (male)
Biscoe 2007 5 5 16 17 0 0
Biscoe 2008 9 9 22 23 0 0
Biscoe 2009 8 8 20 21 0 0
Dream 2007 9 10 0 0 13 13
Dream 2008 8 8 0 0 9 9
Dream 2009 10 10 0 0 12 12
Torgersen 2007 8 7 0 0 0 0
Torgersen 2008 8 8 0 0 0 0
Torgersen 2009 8 8 0 0 0 0

Quantidade de pinguins por espécie e sexo

4. Melhorar os nomes das colunas

Nomes das colunas são importantes em tabelas. No nosso caso, a repetição do nome da espécie para diferentes sexos torna a leitura entediante. Vamos agrupar as colunas por espécie.

```{r}
#| warning: false
#| message: false
#| fig-cap: "Quantidade de pinguins por espécie e sexo"
#| label: palmer5

penguins_gt <- 
  penguins_gt %>% 
  cols_label(
    `Adelie (female)` = "female",
    `Adelie (male)`   = "male",
    `Gentoo (female)` = "female",
    `Gentoo (male)`   = "male",
    `Chinstrap (female)` = "female",
    `Chinstrap (male)` = "male"
  ) %>% 
  tab_spanner(
    label = c("Adele"),
    columns = c(`Adelie (female)`, `Adelie (male)`)
  ) %>% 
  tab_spanner(
    label = c("Chinstrap"),
    columns = c(`Chinstrap (female)`, `Chinstrap (male)`)
  ) %>% 
  tab_spanner(
    label = c("Gentoo"),
    columns = c(`Gentoo (female)`, `Gentoo (male)`)
  ) %>% 
  tab_style(style = cell_text(weight = "bold"),
            location = cells_column_spanners())

penguins_gt
```
Pinguins no Arquipélago Palmer na Antártica
palmerpinguins in R dataset
island year Adele Gentoo Chinstrap
female male female male female male
Biscoe 2007 5 5 16 17 0 0
Biscoe 2008 9 9 22 23 0 0
Biscoe 2009 8 8 20 21 0 0
Dream 2007 9 10 0 0 13 13
Dream 2008 8 8 0 0 9 9
Dream 2009 10 10 0 0 12 12
Torgersen 2007 8 7 0 0 0 0
Torgersen 2008 8 8 0 0 0 0
Torgersen 2009 8 8 0 0 0 0

Quantidade de pinguins por espécie e sexo

6. Agrupe colunas com dados que se repetem

A coluna island é muito repetitiva e ao invés dela, podemos agrupar os dados em linhas agrupadoras.

```{r}
#| warning: false
#| message: false
#| fig-cap: "Quantidade de pinguins por espécie e sexo"
#| label: palmer6

penguins_gt <- 
  penguins %>% 
  count(island, year, species, sex) %>% 
  mutate(island = str_c("Ilha: ", island)) %>% 
  filter(!is.na(sex)) %>% 
  pivot_wider(names_from = c(species, sex),
              values_from = n,
              names_glue = "{species} ({sex})",
              values_fill = NA) %>% 
  gt(rowname_col = "year",
    groupname_col = "island") %>% 
  tab_header(title = "Pinguins no Arquipélago Palmer na Antártica",
             subtitle = "palmerpinguins in R dataset") %>% 
  opt_align_table_header(align = "left") %>% 
  cols_align(align = "right", 
             columns = c(`Adelie (female)`, `Adelie (male)`,
                         `Gentoo (female)`, `Gentoo (male)`,
                         `Chinstrap (female)`, `Chinstrap (male)`)) %>%
  cols_label(
    `Adelie (female)` = "female",
    `Adelie (male)`   = "male",
    `Gentoo (female)` = "female",
    `Gentoo (male)`   = "male",
    `Chinstrap (female)` = "female",
    `Chinstrap (male)` = "male"
  ) %>% 
  tab_spanner(
    label = c("Adele"),
    columns = c(`Adelie (female)`, `Adelie (male)`)
  ) %>% 
  tab_spanner(
    label = c("Gentoo"),
    columns = c(`Gentoo (female)`, `Gentoo (male)`)
  ) %>% 
  tab_spanner(
    label = c("Chinstrap"),
    columns = c(`Chinstrap (female)`, `Chinstrap (male)`)
  ) %>% 
  tab_style(style = cell_text(weight = "bold"),
            location = cells_column_spanners()) %>% 
  tab_style(style = cell_text(weight = "bold"),
            location = cells_row_groups()) %>% 
  sub_missing(
    columns = everything(),
    missing_text = "-"
  )
  # An option for positioning the row_group label
  # %>%
  # tab_options(
  #   row_group.as_column = TRUE
  # )

penguins_gt
```
Pinguins no Arquipélago Palmer na Antártica
palmerpinguins in R dataset
Adele Gentoo Chinstrap
female male female male female male
Ilha: Biscoe
2007 5 5 16 17 - -
2008 9 9 22 23 - -
2009 8 8 20 21 - -
Ilha: Dream
2007 9 10 - - 13 13
2008 8 8 - - 9 9
2009 10 10 - - 12 12
Ilha: Torgersen
2007 8 7 - - - -
2008 8 8 - - - -
2009 8 8 - - - -

Quantidade de pinguins por espécie e sexo

7. Acrescentando linhas de sumarização

Linhas de sumarização ajudam na leitura dos dados.

```{r}
#| warning: false
#| message: false
#| fig-cap: "Quantidade de pinguins por espécie e sexo"
#| label: palmer7

fns_labels <- 
  list(
   # avg = ~mean(., na.rm = TRUE),
    `Média` = ~mean(., na.rm = TRUE)
   #,
   # s.d. = ~sd(., na.rm = TRUE)
  )

penguins_gt <- 
  penguins_gt %>% 
  summary_rows(
    groups = TRUE,
    columns = c(`Adelie (female)`, `Adelie (male)`,
                `Gentoo (female)`, `Gentoo (male)`,
                `Chinstrap (female)`, `Chinstrap (male)`),
    fns = fns_labels,
    formatter = fmt_number,
    decimals = 0
    ) 

penguins_gt
```
Pinguins no Arquipélago Palmer na Antártica
palmerpinguins in R dataset
Adele Gentoo Chinstrap
female male female male female male
Ilha: Biscoe
2007 5 5 16 17 - -
2008 9 9 22 23 - -
2009 8 8 20 21 - -
Ilha: Dream
2007 9 10 - - 13 13
2008 8 8 - - 9 9
2009 10 10 - - 12 12
Ilha: Torgersen
2007 8 7 - - - -
2008 8 8 - - - -
2009 8 8 - - - -

Quantidade de pinguins por espécie e sexo

8. Eliminar os valores com zero

Os zeros atrapalham a leitura. Vamos substituí-los por um hífen para facilitar a leitura.

```{r}
#| warning: false
#| message: false
#| fig-cap: "Quantidade de pinguins por espécie e sexo"
#| label: palmer8

penguins_gt <- 
  penguins_gt %>% 
  sub_zero(columns = c(`Adelie (female)`, `Adelie (male)`,
                `Gentoo (female)`, `Gentoo (male)`,
                `Chinstrap (female)`, `Chinstrap (male)`),
           zero_text = "-")

penguins_gt
```
Pinguins no Arquipélago Palmer na Antártica
palmerpinguins in R dataset
Adele Gentoo Chinstrap
female male female male female male
Ilha: Biscoe
2007 5 5 16 17 - -
2008 9 9 22 23 - -
2009 8 8 20 21 - -
Ilha: Dream
2007 9 10 - - 13 13
2008 8 8 - - 9 9
2009 10 10 - - 12 12
Ilha: Torgersen
2007 8 7 - - - -
2008 8 8 - - - -
2009 8 8 - - - -

Quantidade de pinguins por espécie e sexo

9. Acrescentar uma linha de sumarização total no final

Para sabermos o total de pinguins em todas as ilhas, vamos acrescentar uma linha contendo uma

```{r}
#| warning: false
#| message: false
#| fig-cap: "Quantidade de pinguins por espécie e sexo"
#| label: palmer9

fns_grand_labels <- 
  list(
    `Média Geral` = ~mean(., na.rm = TRUE)
  )

penguins_gt <- 
  penguins_gt %>% 
  grand_summary_rows(
    columns = c(`Adelie (female)`, `Adelie (male)`,
                `Gentoo (female)`, `Gentoo (male)`,
                `Chinstrap (female)`, `Chinstrap (male)`),
    fns = fns_grand_labels,
    formatter = fmt_number,
    decimals = 0,
    missing_text = "-"
  ) %>% 
  tab_style(style = cell_fill(color = "darkgray"),
            location = cells_grand_summary())

penguins_gt
```
Pinguins no Arquipélago Palmer na Antártica
palmerpinguins in R dataset
Adele Gentoo Chinstrap
female male female male female male
Ilha: Biscoe
2007 5 5 16 17 - -
2008 9 9 22 23 - -
2009 8 8 20 21 - -
Ilha: Dream
2007 9 10 - - 13 13
2008 8 8 - - 9 9
2009 10 10 - - 12 12
Ilha: Torgersen
2007 8 7 - - - -
2008 8 8 - - - -
2009 8 8 - - - -
Média Geral 8 8 19 20 11 11

Quantidade de pinguins por espécie e sexo

Citation

BibTeX citation:
@misc{abreu2022,
  author = {Abreu, Marcos},
  title = {R Tip: Criando Tabelas Com o Pacote Gt},
  date = {2022-11-05},
  url = {https://abreums.github.io/posts/2022-11-05-r-tip-criando-tabelas-para-o-pacote-gt/},
  langid = {en}
}
For attribution, please cite this work as:
Abreu, Marcos. 2022. “R Tip: Criando Tabelas Com o Pacote Gt.” November 5, 2022. https://abreums.github.io/posts/2022-11-05-r-tip-criando-tabelas-para-o-pacote-gt/.