Tabelas incriveis com R
Alguns pacotes que serão bem úteis na hora de criar tabelas lindas e informativas!
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")
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 | 20,000 | 0.10 (rank: 10) | Sim |
| 2 | Kiara | 30,000 | 0.20 (rank: 09) | Não |
| 3 | Dunki | 50,000 | 0.50 (rank: 05) | Sim |
| 4 | Edgar | 70,000 | 0.95 (rank: 02) | Não |
| 5 | Emilia | 47,000 | 0.97 (rank: 01) | Sim |
| 6 | Gertrudes | 80,000 | 0.45 (rank: 06) | Não |
| 7 | Genovena | 45,000 | 0.62 (rank: 03) | Não |
| 8 | Champanhe | 35,000 | 0.57 (rank: 04) | Sim |
| 9 | Amora | 20,000 | 0.37 (rank: 07) | Sim |
| 10 | Penelope | 25,000 | 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
library(knitr)
library(kableExtra)
#Carregando pacote para ajudar na manipulação dos dados:
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))
| 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:
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.

Share this post
Twitter
LinkedIn
Email