Tabelas incriveis com R

Alguns pacotes que serão bem úteis na hora de criar tabelas lindas e informativas!

Fellipe Gomes

8 minute read

Importâcia da apresentação dos dados

O trabalho do estatístico vai muito além do planejamento, sumarização e interpretação de observações para fornecer a melhor informação possível a partir do dados disponíveis. O processo de analises deve ser tratado na etapa final de todo projeto ou pesquisa que envolva apresentação dos resultados, não é atoa que já até existem áreas dentro da ciência de dados focada nesta tarefa, recebendo o título de “Data Artist”.

Além da variedade de pacotes que auxiliam na apresentação das figuras geradas nas análises(como já foi visto em alguns posts como estes para visualizar a qualidade do ajuste de modelos ou este para valiar ajuste de modelos pela abordagem bayesiana), também contamos com alguns pacotes que possibilitam a apresentação de tabelas de maneira bastante satisfatória (de forma elegante e até interativa)

Seja escrevendo relatórios em \(\LaTeX\), Rmarkdown ou até mesmo um aplicativo shiny , este posta tem a finalidade de trazer algumas alternativas para a boa apresentação dos resultados.

Como de costume vou apresentar alguns pacotes que serão bem úteis na hora de criar aquelas tabelas lindas e informativas que qualquer cliente adora.

Pacote DT

O pacote DT é uma excelente opção quando se trata de incluir tabelas de dados em relatórios Rmarkdown, o pacote esta hospedado neste link no github, veja a seguir um simples exemplo de uso:

# install.packages("DT")  #caso ainda nao tenha o pacote instalado
DT::datatable(iris[1:20, c(5, 1:4)], rownames = FALSE)

Com este link do manual no CRAN é possível entender melhor o funcionamento do pacote e conferir mais exemplos de uso.

Pacote formattable

Este pacote é repleto de funcionalidades interessantes para a formatação dos resultados dispostos em tabelas, também está hospedado no github, podendo ser instalado pelo CRAN ou com os comandos:

# Instalando pelo github
# library(devtools)
# devtools::install_github("renkun-ken/formattable")
suppressMessages(library(formattable))

Com o pacote carregado vamos conferir algumas das funcionalidades básicas:

#Exemplo de formatação para resultados de porcentagem:
percent(c(0.1, 0.02, 0.03, 0.12))
## [1] 10.00% 2.00%  3.00%  12.00%
#Exemplo de formatação para resultados de na casa do milhar:
accounting(c(1000, 500, 200, -150, 0, 1200))
## [1] 1,000.00 500.00   200.00   (150.00) 0.00     1,200.00

Vamos criar um data.frame para ilustrar algumas das funcionalidades do pacote:

#criando um data.frame
df <- data.frame(
  id = 1:10, 
  Nomes = c("Sofia", "Kiara", "Dunki", "Edgar", "Emilia","Gertrudes", "Genovena", "Champanhe", "Amora", "Penelope"),
  Kilos = accounting(c(20000, 30000, 50000, 70000, 47000,80000,45000,35000,20000,25000), format = "d"),
  Crescimento = percent(c(0.1, 0.2, 0.5, 0.95, 0.97,0.45,0.62,0.57,0.37, 0.3), format = "d"),
  Suficiente = formattable(c(T, F, T, F, T,F,F,T,T,F), "Sim", "Não"))

Com esses resultados, vejamos um exemplo de tabela que pode ser criada para apresentar esses resultados com o pacote:

formattable(df, list(
  id = color_tile("white", "orange"),
  Suficiente = formatter("span", style = x ~ ifelse(x == T, 
                                               style(color = "green", font.weight = "bold"), NA)),
  area(col = c(Kilos)) ~ normalize_bar("lightgrey", 0.2),
  Crescimento = formatter("span",
                          style = x ~ style(color = ifelse(rank(-x) <= 3, "green", "gray")),
                          x ~ sprintf("%.2f (rank: %02g)", x, rank(-x)))
))
id Nomes Kilos Crescimento Suficiente
1 Sofia 20000 0.10 (rank: 10) Sim
2 Kiara 30000 0.20 (rank: 09) Não
3 Dunki 50000 0.50 (rank: 05) Sim
4 Edgar 70000 0.95 (rank: 02) Não
5 Emilia 47000 0.97 (rank: 01) Sim
6 Gertrudes 80000 0.45 (rank: 06) Não
7 Genovena 45000 0.62 (rank: 03) Não
8 Champanhe 35000 0.57 (rank: 04) Sim
9 Amora 20000 0.37 (rank: 07) Sim
10 Penelope 25000 0.30 (rank: 08) Não

Para entender melhor o funcionamento do pacote e conferir mais exemplo de uso confira o manual de introdução ao pacote e manual do pacote, ambos disponíveis no CRAN.

O pacote knitr e kabbleExtra

O pacote knitr permite o uso da função kable() que produz tabelas parecidas com as apresentadas com o pacote DT, porém trás diversas outras funcionalidades que podem ser combinadas com as funcionalidades de outros pacotes, como o kableExtra e até mesmo o formattable apresentado acima.

Os exemplos aqui apresentados foram retirados (sem alterações) do manual do pacote no CRAN

#Carregando pacotes
suppressMessages(library(knitr))
suppressMessages(library(kableExtra))
#Carregando pacote para ajudar na manipulação dos dados:
suppressMessages(library(dplyr))

mtcars[1:10, 1:2] %>%
  mutate(
    car = row.names(.),
    # Você não precisa de formato = "html" se você já definiu opções (knitr.table.format)
    mpg = cell_spec(mpg, "html", color = ifelse(mpg > 20, "red", "blue")),
    cyl = cell_spec(cyl, "html", color = "white", align = "c", angle = 45, 
                    background = factor(cyl, c(4, 6, 8), 
                                        c("#666666", "#999999", "#BBBBBB")))) %>%
  select(car, mpg, cyl) %>%
  kable("html", escape = F) %>%
  kable_styling("striped", full_width = F)
car mpg cyl
Mazda RX4 21 6
Mazda RX4 Wag 21 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6
Duster 360 14.3 8
Merc 240D 24.4 4
Merc 230 22.8 4
Merc 280 19.2 6
#Outro exemplo colorido legal:
iris[1:10, ] %>%
  mutate_if(is.numeric, function(x) {
    cell_spec(x, "html", bold = T, color = spec_color(x, end = 0.9),
              font_size = spec_font_size(x))
  }) %>%
  mutate(Species = cell_spec(
    Species, "html", color = "white", bold = T,
    background = spec_color(1:10, end = 0.9, option = "A", direction = -1)
  )) %>%
  kable("html", escape = F, align = "c") %>%
  kable_styling("striped", full_width = F)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5 3.6 1.4 0.2 setosa
5.4 3.9 1.7 0.4 setosa
4.6 3.4 1.4 0.3 setosa
5 3.4 1.5 0.2 setosa
4.4 2.9 1.4 0.2 setosa
4.9 3.1 1.5 0.1 setosa

Mais um exemplo, dessa vez integrando com o pacote formattable:

#Integrando com formattable
suppressMessages(library(formattable))
mtcars[1:5, 1:4] %>%
  mutate(
    car = row.names(.),
    mpg = color_tile("white", "orange")(mpg),
    cyl = cell_spec(cyl, "html", angle = (1:5)*60, 
                    background = "red", color = "white", align = "center"),
    disp = ifelse(disp > 200,
                  cell_spec(disp, "html", color = "red", bold = T),
                  cell_spec(disp, "html", color = "green", italic = T)),
    hp = color_bar("lightgreen")(hp)
  ) %>%
  select(car, everything()) %>%
  kable("html", escape = F) %>%
  kable_styling("hover", full_width = F) %>%
  column_spec(5, width = "3cm") %>%
  add_header_above(c(" ", "Hello" = 2, "World" = 2))
Hello
World
car mpg cyl disp hp
Mazda RX4 21.0 6 160 110
Mazda RX4 Wag 21.0 6 160 110
Datsun 710 22.8 4 108 93
Hornet 4 Drive 21.4 6 258 110
Hornet Sportabout 18.7 8 360 175

O pacote sparklike

O sparklike é um pacote ótimo para enriquecer as aprestações de forma que possibilita incluir “mini gráficos” como boxplots, gráfico de linhas ou barras diretamente nas tabelas, como se fosse uma coluna do data.frame!

Seu funcionamento é bem simples e poderoso, apresento aqui alguns exemplo de uso, caso queira conferir mais detalhes, pode conferir o manual do pacote no CRAN ou esta página.

# library(devtools)
# install_github('htmlwidgets/sparkline')

#Carregando o pacote:
library(htmlwidgets)
library(sparkline)

#Exemplos de uso:
x = rnorm(20)
sparkline(x)
sparkline(x, type = 'bar')
sparkline(x, type = 'box')

Exemplo de tabela para rmarkdown, a partir dessa sequência de códigos markdown e R:

#Seja:
set.seed(1234)
x = rnorm(10)
y = rnorm(10)

#Ao digitar isso:

| Var.  | Sparkline         | Boxplot                       | Bar                          
|-------|-------------------|-------------------------------|------------------------------
| x     | `r sparkline(x)`  | `r sparkline(x, type ='box')` |`r sparkline(x, type = 'bar')`
| y     | `r sparkline(y)`  | `r sparkline(y, type ='box')` |`r sparkline(y, type = 'bar')`

Exibe isso:

O pacote rhandsontable

Mais um pacote repleto de funcionalidades que permitem a implementação de tabelas elegantes para a apresentação de projetos e pesquisas. Por se tratar de um htmlwidgets, este pacote em especial é uma boa opção quando deseja-se apresentar tabela sem documentos no formato html ou com aplicativos shiny por exemplo.

Primeiramente apresentarei aqui primeiramente um exemplo com tabela de correlações utilizando formatação condicional:

#Carregando o pacote:
suppressMessages(library(rhandsontable))

#Tabela para correlações
rhandsontable(cor(iris[,-5]), readOnly = TRUE, width = 750, height = 300) %>%
  hot_cols(renderer = "
           function (instance, td, row, col, prop, value, cellProperties) {
           Handsontable.renderers.TextRenderer.apply(this, arguments);
           if (row == col) {
           td.style.background = 'lightgrey';
           } else if (col > row) {
           td.style.background = 'grey';
           td.style.color = 'grey';
           } else if (value < -0.75) {
           td.style.background = 'pink';
           } else if (value > 0.75) {
           td.style.background = 'lightgreen';
           }
           }")

Como este pacote possui muitas funcionalidades, apresentarei mais três exemplos baseados nas instruções do pacote e caso queira entender melhor o funcionamento e obter mais exemplos, consultar o manual no CRAN

#Tabela com mini gráficos
#criando um data.frame
df <- data.frame(
  id = 1:10, 
  Nomes = c("Sofia", "Kiara", "Dunki", "Edgar", "Aline","Gertrudes", "Genovena", "Champanhe", "Pérola", "Penelope"),
  Kilos = accounting(c(20000, 30000, 50000, 70000, 47000,80000,45000,35000,20000,25000), format = "d"),
  Crescimento = percent(c(0.1, 0.2, 0.5, 0.95, 0.97,0.45,0.62,0.57,0.37, 0.3), format = "d"),
  Suficiente = c(T, F, T, F, T,F,F,T,T,F))

#E os gráficos de barra:
df$chart = c(sapply(1:5,
                    function(x) jsonlite::toJSON(list(values=rnorm(10,10,10),
                                                      options = list(type = "bar")))),
             sapply(1:5,
                    function(x) jsonlite::toJSON(list(values=rnorm(10,10,10),
                                                      options = list(type = "line")))))
rhandsontable(df, rowHeaders = NULL, width = 550, height = 300) %>%
  hot_col("chart", renderer = htmlwidgets::JS("renderSparkline"))

Também podemos incluir comentários em células específicas da tabela utilizando este pacote, veja:

(Para ver os comentários basta passar o mouse sobre a célula com a marcação vermelha na borda)

#Incluindo comentarios:
comments = matrix(ncol = ncol(df), nrow = nrow(df))
comments[1, 1] = "Exemplo de comentário"
comments[2, 2] = "Outro exemplo de comentario"

rhandsontable(df, comments = comments, width = 550, height = 300)%>%
  hot_col("chart", renderer = htmlwidgets::JS("renderSparkline"))

Caso a tabela dos dados seja muito grande, também podemos utilizar o pacote para gerar a tabela com a barra de rolar

#Tabela com barra de rolar para grande base de dados
rhandsontable(mtcars, rowHeaderWidth = 200, width = 700, height = 550)

Relatórios muito mais bonitos

Com essas lindas tabelas seus relatórios serão irresistíveis, até quem não entende de estatística vai passar a gostar depois de ver tanta beleza com números! Espero que tenha gostado do conteúdo, caso queira acrescentar ou reportar algo basta entrar em contato.

comments powered by Disqus