Hospital | Total de casos com desfecho conhecido | Recuperados | Óbito | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana de valores CT | Total | % de casos | Mediana de valores CT | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
29 Tabelas para apresentação
Esta seção demonstra como converter data frames resumo dos seus dados em tabelas prontas para apresentação com o uso do pacote flextable. Estas tabelas podem ser inseridas em slides do programa powerpoint, em páginas HTML ou documentos em formatos PDF ou Word, entre outros.
É preciso compreender que, antes de usar o pacote flextable, você deve criar a tabela resumida como um data frame. Você pode utilizar os métodos das Tabelas Descritivas ou Pivoteando dados, tais como: tabulações, tabulações cruzadas, pivotamento e calcular estatísticas descritivas. O data frame resultantes pode então ser utilizado na função flextable para formatar a visualização.
Há muitos outros pacotes R que podem ser usados para elaborar tabelas para apresentação – aqui, nós escolhemos destacar o pacote “flextable” nesta seção. Um exemplo usando o pacote knitr e sua função kable()
pode ser encontrado na página de Rastreamento de Contatos. Da mesma maneira, o pacote DT é evidenciado na seção de Paineis com Shiny. Outros programas, tais como o GT e o huxtable são mencionados na página de pacotes sugeridos Pacotes sugeridos.
29.1 Preparação
Carregando pacotes
Instalar e carregar o pacote flextable. Neste manual, nós destacamos o p_load()
do pacman, o qual instala o pacote, se necessário, e o carrega para ser utilizado. Você também pode carregar os pacotes com library()
presente no R base. Veja a seção sobre Introdução ao R para obter mais informações sobre os pacotes “R”.
::p_load(
pacman# importar/exportar
rio, # caminho do arquivo
here, # fazer tabelas HTML
flextable, # Funções auxiliares para tabelas
officer, # visualização, resumo e gerenciamento dos dados tidyverse)
Importando dados
Para começar, nós importamos a linelist dos casos que simulam uma epidemia de Ebola. Se você quiser acompanhar, clique para baixar o “clean”linelist (como arquivo .rds). Importe dados com a função import()
do pacote rio (ele trabalho com vários tipos de arquivo, tais como: .xlsx, .csv, .rds - você pode visualizar a seção Importar e exportar para outros detalhes).
# importar a linelist
<- import("linelist_cleaned.rds") linelist
As primeiras 50 linhas da linelist estão exibidas abaixo:
Preparar a tabela
Antes de começar a utilizar o pacote flextable você precisará criar a sua tabela como um data frame. Veja a seção em Tabelas descritivas e Pivotando dados para aprender a criar um quadro de dados utilizando pacotes como janitor* e dplyr. Você deverá organizar o conteúdo em linhas e colunas conforme você queira que seja exibido. Então, o conjunto de dados será passado para o comando flextable para ser exibido com cores, cabeçalhos, fontes, etc.
Abaixo está um exemplo da página Tabelas descritivas de conversão dos casos na linelist
dentro de um conjunto de dados que resume os resultados dos pacientes e os valores de CT (limiar de detecção, da sigla em inglês “cycle threshold”) por hospital, com uma linha de Totais na parte inferior. A saída é salva como o objeto table
.
<- linelist %>%
table
# Obter valores resumidos por grupo hospital-resultado
###############################################
group_by(hospital, outcome) %>% # Dados por grupo
summarise( # Criar novas colunas resumidas de indicadores de interessse
N = n(), # Numero de linhas por grupo hospital-resultado
ct_value = median(ct_blood, na.rm=T)) %>% # mediana do valor de TC por grupo
# add totals
############
bind_rows( # Vincular as tabelas prévias com esta mini-tabela de totais
%>%
linelist filter(!is.na(outcome) & hospital != "Missing") %>%
group_by(outcome) %>% # Agrupar somente pelo resultado, não pelo hospital
summarise(
N = n(), # Número de linhas para conjunto de dados total
ct_value = median(ct_blood, na.rm=T))) %>% # Mediana de CT para conjunto de dados total
# Pivot wider and format
########################
mutate(hospital = replace_na(hospital, "Total")) %>%
pivot_wider( # Colunas longas e amplas
values_from = c(ct_value, N), # novos valores de CT e colunas de contagem
names_from = outcome) %>% # novos nomes da colunas são de resultados
mutate( # Adicionar novas colunas
N_Known = N_Death + N_Recover, # número com resultados conhecidos
Pct_Death = scales::percent(N_Death / N_Known, 0.1), # porcentagem de casos de óbitos (com 1 casa decimal)
Pct_Recover = scales::percent(N_Recover / N_Known, 0.1)) %>% # porcentagem dos reuperados (com 1 casa decimal)
select( # Reordenar as colunas
# Colunas introdutórias
hospital, N_Known, # Coluna dos recuperados
N_Recover, Pct_Recover, ct_value_Recover, %>% # Coluna de óbitos
N_Death, Pct_Death, ct_value_Death) arrange(N_Known) # Organizar linhas da mais alta para mais baixa (linha superior a linha Total)
# impressão table
# A tibble: 7 × 8
# Groups: hospital [7]
hospital N_Known N_Recover Pct_Recover ct_value_Recover N_Death Pct_Death
<chr> <int> <int> <chr> <dbl> <int> <chr>
1 St. Mark's M… 325 126 38.8% 22 199 61.2%
2 Central Hosp… 358 165 46.1% 22 193 53.9%
3 Other 685 290 42.3% 21 395 57.7%
4 Military Hos… 708 309 43.6% 22 399 56.4%
5 Ausente 1125 514 45.7% 21 611 54.3%
6 Port Hospital 1364 579 42.4% 21 785 57.6%
7 Total 4565 1983 43.4% 21 2582 56.6%
# ℹ 1 more variable: ct_value_Death <dbl>
29.2 Básico do flextable
Criar um flextable
Para criar e gerenciar os objetos do comando flextable, passamos primeiro o conjunto de dados por meio da função flextable()
. Nós salvamos os resultados como my_table
.
<- flextable(table)
my_table my_table
hospital | N_Known | N_Recover | Pct_Recover | ct_value_Recover | N_Death | Pct_Death | ct_value_Death |
---|---|---|---|---|---|---|---|
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
Após ter feito isso, podemos progresssivamente vincular o objeto my_table
por meio de outras funções de formatação flextable.
Nesta página, por uma questão de clareza, nós devemos salvar a tabela em níveis intermediários como my_table
, e adicionando as funções flextable uma a uma. Se você quiser ver uma parte de todos os comandos escritos do início ao fim, visite a seção logo abaixo Todos os códigos juntos.
A sintaxe geral de cada linha de comando flextable* é a seguinte:
função(tabela, i = X, j = X, part = "X")
, onde:- A ‘função’ pode ser uma das das muitas funções diferentes, tais como
width()
para determinar a largura de colunas,bg()
para definir as cores do plano de fundo,align()
para ajustar o alinhamento do texto centro/direita/esquerda, e assim por diante. tabela =
é o nome do seu conjunto de dados, embora não precise estar explícita, se a sua data frame estiver escadeada com um pipe (%>%) à função.part =
se refere em qual parte da tabela a função deverá ser aplicada. Por exemplo, “cabeçalho”, “corpo” ou “todos”, (“header”, “body” ou “all”).i =
especifica a linha (row) para aplicar a função, onde ‘X’ é o número da linha. Se há linhas múltiplas, por exemplo, da primeira a terceira linha, pode especificar:i = c(1:3)
. Observe que se o corpo estiver selecionado (‘body’), a primeira linha começa a ser contada abaixo do cabeçalho.`j = ` especifica a coluna a qual aplicar função, onde 'x' é o número ou nome das colunas. Se houver colunas multiplas, por exemplo, da quinta e à sexta colunas, pode-se especificar: `j = c(5,6)`.
- A ‘função’ pode ser uma das das muitas funções diferentes, tais como
Você pode encontrar a lista completa das funções de formatação do comando flextable clique aqui ou revisar a documentação inserindo ?flextable
.
Largura das colunas
Nós podemos usar a função autofit()
, para expandir a tabela para que cada célula tenha somente uma linha de texto. A função qflextable()
é uma abreviação mais simples para flextable()
and autofit()
.
%>% autofit() my_table
hospital | N_Known | N_Recover | Pct_Recover | ct_value_Recover | N_Death | Pct_Death | ct_value_Death |
---|---|---|---|---|---|---|---|
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
No entanto, nem sempre isto poderá ser apropriado, principalmente se houver valores muito longos dentro das células, o que significa que a tabela pode não ter o tamanho da página.
Por isso, podemos especificar larguras com a função width ()
. Isto pode ser feito arredondando um pouco para saber qual valor de largura inserir. No exemplo abaixo, especificamos larguras diferentes para cada coluna 1, coluna 2 e colunas 4 a 8.
<- my_table %>%
my_table width(j=1, width = 2.7) %>%
width(j=2, width = 1.5) %>%
width(j=c(4,5,7,8), width = 1)
my_table
hospital | N_Known | N_Recover | Pct_Recover | ct_value_Recover | N_Death | Pct_Death | ct_value_Death |
---|---|---|---|---|---|---|---|
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
Cabeçalhos/Títulos das colunas
Queremos cabeçalhos mais simples para facilitar a interpretação do conteúdo das tabelas.
Para esta tabela, queremos acrescentar uma segunda camada do cabeçalho para que as colunas que cobrem os mesmos subgrupos possam ser agrupadas. Nós fazemos isto usando a função add_header_row()
com top = TRUE
. Nós colocamos o novo nome de cada coluna para valores usando o comando values =
, e para deixar colunas com valores vazios use ""
que sabemos que iremos mesclar mais tarde.
Nós também podemos renomear os nomes do cabeçalho em um segundo nível de cabeçalho usando um comando separado set_header_labels()
.
Finalmente, para “combinar” certos cabeçalhos das colunas no cabeçalho superior, utilizamos o comando merge_at()
para mesclar os cabeçalhos da coluna na linha do cabeçalho superior.
<- my_table %>%
my_table
add_header_row(
top = TRUE, # Novo cabeçalho posicionado acima da linha do cabeçalho existente
values = c("Hospital", # Valores dos cabeçalhos para cada coluna abaixo
"Total de casos com desfecho conhecido",
"Recuperado", # este será o nome desta coluna e das duas seguintes
"",
"",
"Óbitos", # este será o nome desta coluna e das duas seguintes
"", # Deixar em branco, essa coluna sera mesclada com a coluna óbitos
"")) %>%
set_header_labels( # Renomear as colunas na linha original do cabeçalho
hospital = "",
N_Known = "",
N_Recover = "Total",
Pct_Recover = "% de casos",
ct_value_Recover = "Mediana dos valores CT",
N_Death = "Total",
Pct_Death = "% de casos",
ct_value_Death = "Mediana dos valores C") %>%
merge_at(i = 1, j = 3:5, part = "header") %>% # Mesclar horizontalmente colunas 3 a 5 na nova linha do cabeçalho
merge_at(i = 1, j = 6:8, part = "header") # Mesclar horizontalmente colunas 6 a 8 na nova linha do cabeçalho
# visualizar my_table
Hospital | Total de casos com desfecho conhecido | Recuperado | Óbitos | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana dos valores CT | Total | % de casos | Mediana dos valores C | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
Bordas e plano de fundo
Você pode ajustar as bordas, linhas internas, entre outros, com várias funções do comando flextable. Freqüentemente, é mais fácil começar removendo todas as bordas existentes com border_remove()
.
Depois, você pode aplicar os temas de borda padrão com as funções theme_box()
, theme_booktabs()
, ou theme_alafoli()
.
Linhas verticais e horizontais poderão ser adicionadas com uma variedade de funções. Os comandos hline()
e vline()
, adicionam linhas a uma linha ou coluna especificada, respectivamente. Dentro de cada uma, você deve especificar a part =
como “all” (tudo), “body” (corpo da tabela), ou “header” (cabeçalho). Para linhas verticais, especificar a coluna para j =
, e para linhas horizontais, a linha para i =
. Outras funções como vline_right()
, vline_left()
, hline_top()
, e hline_bottom()
adicionam linhas apenas na parte externa da tabela.
Em todas estas funções, o estilo atual para linha deve ser especificado para border =
e deve ser a saída de um comando separado utilizando a função fp_border()
do pacote officer. Esta função vai ajudá-lo a definir a largura e a cor da linha. Você poderá definir isto acima dos comandos da tabela, conforme apresentado no script abaixo.
# definir estilo pa linha da borda
= officer::fp_border(color="black", width=1)
border_style
# adicionar linhas de bordas na tabela
<- my_table %>%
my_table
# Remover todas as bordas existentes
border_remove() %>%
# adicionar linhas por meio de configurações de temas pré-determinados
theme_booktabs() %>%
# adcionar linhas verticais para separar seção de Recuperados e Óbitos
vline(part = "all", j = 2, border = border_style) %>% # na coluna 2
vline(part = "all", j = 5, border = border_style) # na coluna 5
my_table
Hospital | Total de casos com desfecho conhecido | Recuperado | Óbitos | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana dos valores CT | Total | % de casos | Mediana dos valores C | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
Fonte e Alinhamento
Alinhamos todas as colunas ao centro, em paralelo a coluna mais à esquerda com os nomes dos hospitais, utilizando a função align()
de flextable**.
<- my_table %>%
my_table ::align(align = "center", j = c(2:8), part = "all")
flextable my_table
Hospital | Total de casos com desfecho conhecido | Recuperado | Óbitos | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana dos valores CT | Total | % de casos | Mediana dos valores C | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
Ademais, podemos aumentar o tamanho da fonte de cabeçalho e alterá-la para negrito. Também podemos alterar a linha total para negrito.
<- my_table %>%
my_table fontsize(i = 1, size = 12, part = "header") %>% # ajustar o tamanho da fonte do cabeçalho
bold(i = 1, bold = TRUE, part = "header") %>% # colocar o cabeçalho em negrito
bold(i = 7, bold = TRUE, part = "body") # ajustar a linha de totais para negrito
my_table
Hospital | Total de casos com desfecho conhecido | Recuperado | Óbitos | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana dos valores CT | Total | % de casos | Mediana dos valores C | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
Podemos assegurar que as colunas de proporção exibam somente uma casa decimal utilizando a função colformat_num()
. Observe que isto também poderia ter sido feito na fase de gerenciamento de dados com a função round()
.
<- colformat_num(my_table, j = c(4,7), digits = 1)
my_table my_table
Hospital | Total de casos com desfecho conhecido | Recuperado | Óbitos | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana dos valores CT | Total | % de casos | Mediana dos valores C | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
Células Mescladas
Da mesma forma que mesclamos as células horizontalmente na linha de cabeçalho, também podemos mesclar as células verticalmente utilizando merge_at()
e especificando as linhas (i
) e coluna (j
). Aqui mesclamos os valores “Hospital” e “Total de casos com desfecho conhecido” verticalmente para lhes dar mais espaço.
<- my_table %>%
my_table merge_at(i = 1:2, j = 1, part = "header") %>%
merge_at(i = 1:2, j = 2, part = "header")
my_table
Hospital | Total de casos com desfecho conhecido | Recuperado | Óbitos | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana dos valores CT | Total | % de casos | Mediana dos valores C | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
Cor do plano de fundo
Para distinguir o conteúdo dos cabeçalhos da tabela, podemos acrescentar uma formatação adicional. Por exemplo, mudar a cor do plano de fundo. Neste exemplo, alteramos o corpo da tabela para cinza.
<- my_table %>%
my_table bg(part = "body", bg = "gray95")
my_table
Hospital | Total de casos com desfecho conhecido | Recuperado | Óbitos | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana dos valores CT | Total | % de casos | Mediana dos valores C | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
29.3 Formatação condicional
Podemos destacar todos os valores em uma coluna que atendam a uma determinada regra, por exemplo, onde mais de 55% dos casos morreram. Simplesmente insira os critérios no argumento i =
ou j =
, precedido por um til ~
. Referencie aos nomes da coluna como são no data frame, não aos valores do cabeçalho que criou para exibição.
%>%
my_table bg(j = 7, i = ~ Pct_Death >= 55, part = "body", bg = "red")
Hospital | Total de casos com desfecho conhecido | Recuperado | Óbitos | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana dos valores CT | Total | % de casos | Mediana dos valores C | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
Ou podemos destacar a linha inteira que cumpra a critério determinado, tais como um hospital de interesse. Para fazer isto, removeremos a especificação da coluna (j
) para que os critérios sejam aplicados a todas as colunas.
%>%
my_table bg(., i= ~ hospital == "Military Hospital", part = "body", bg = "#91c293")
Hospital | Total de casos com desfecho conhecido | Recuperado | Óbitos | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana dos valores CT | Total | % de casos | Mediana dos valores C | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
29.4 Todos os comandos juntos
Abaixo apresentamos todos os comandos abordados nesta seção:
= officer::fp_border(color="black", width=1)
border_style
::p_load(
pacman# importar/exportar
rio, # caminho do arquivo
here, # fazer tabelas HTML
flextable, # Funções auxiliares para tabelas
officer, # visualização, resumo e gerenciamento dos dados
tidyverse)
<- linelist %>%
table # filtro
########
#filtro(!is.na(outcome) & hospital != "Missing") %>% # Remove casos com desfecho ou hospital vazios
# Obter valores resumidos por grupo hospital-resultado
###############################################
group_by(hospital, outcome) %>% # Dados por grupo
summarise( # Criar novas colunas resumidas de indicadores de interesse
N = n(), # Numero de linhas por grupo hospital-resultado
ct_value = median(ct_blood, na.rm=T)) %>% # mediana do valor de CT por grupo
# Adicionando Totais
############
bind_rows( # Vincular as tabelas prévias com esta mini-tabela de totais
%>%
linelist filter(!is.na(outcome) & hospital != "Missing") %>%
group_by(outcome) %>% # Agrupar somente pelo resultado, não pelo hospital
summarise(
N = n(), # Número de linhas para conjunto de dados total
ct_value = median(ct_blood, na.rm=T))) %>% # Mediana de CT para conjunto de dados total
# Dados dinâmicos
########################
mutate(hospital = replace_na(hospital, "Total")) %>%
pivot_wider( # Colunas longas e largas
values_from = c(ct_value, N), # novos valores de CT e colunas de contagem
names_from = outcome) %>% # novos nomes da colunas são de resultados
mutate( # Adicionar novas colunas
N_Known = N_Death + N_Recover, # número com resultados conhecidos
Pct_Death = scales::percent(N_Death / N_Known, 0.1), # porcentagem de casos de óbitos (com 1 casa decimal)
Pct_Recover = scales::percent(N_Recover / N_Known, 0.1)) %>% # porcentagem dos reuperados (com 1 casa decimal)
select( # Reordenar as colunas
# Colunas introdutórias
hospital, N_Known, # Coluna dos recuperados
N_Recover, Pct_Recover, ct_value_Recover, %>% # Coluna de óbitos
N_Death, Pct_Death, ct_value_Death) arrange(N_Known) %>% # Organizar linhas da mais alta para mais baixa (linha superior a linha Total)
# formatação
############
flextable() %>%
add_header_row(
top = TRUE, # Novo cabeçalho colocado acima da linha do cabeçalho existente
values = c("Hospital", # Valores dos cabeçalhos para cada coluna abaixo
"Total de casos com desfecho conhecido",
"Recuperados",
"",
"",
"Óbito",
"", # Deixar em branco, essa coluna sera mesclada com a coluna de óbito
"")) %>%
set_header_labels( # Renomear as colunas na linha original do cabeçalho
hospital = "",
N_Known = "",
N_Recover = "Total",
Pct_Recover = "% de casos",
ct_value_Recover = "Mediana de valores CT",
N_Death = "Total",
Pct_Death = "% of cases",
ct_value_Death = "Mediana de valores CT") %>%
merge_at(i = 1, j = 3:5, part = "header") %>% # Mesclar horizontalmente colunas 3 a 5 in nova linha do cabeçalho
merge_at(i = 1, j = 6:8, part = "header") %>%
border_remove() %>%
theme_booktabs() %>%
vline(part = "all", j = 2, border = border_style) %>% # na coluna 2
vline(part = "all", j = 5, border = border_style) %>% # na coluna 5
merge_at(i = 1:2, j = 1, part = "header") %>%
merge_at(i = 1:2, j = 2, part = "header") %>%
width(j=1, width = 2.7) %>%
width(j=2, width = 1.5) %>%
width(j=c(4,5,7,8), width = 1) %>%
::align(., align = "center", j = c(2:8), part = "all") %>%
flextablebg(., part = "body", bg = "gray95") %>%
#bg(., j=c(1:8), i= ~ hospital == "Military Hospital", part = "body", bg = "#91c293") %>%
bg(j = 7, i = ~ Pct_Death >= 55, part = "body", bg = "red") %>%
colformat_num(., j = c(4,7), digits = 1) %>%
bold(i = 1, bold = TRUE, part = "header") %>%
bold(i = 7, bold = TRUE, part = "body")
`summarise()` has grouped output by 'hospital'. You can override using the
`.groups` argument.
table
Hospital | Total de casos com desfecho conhecido | Recuperados | Óbito | ||||
---|---|---|---|---|---|---|---|
Total | % de casos | Mediana de valores CT | Total | % of cases | Mediana de valores CT | ||
St. Mark's Maternity Hospital (SMMH) | 325 | 126 | 38.8% | 22 | 199 | 61.2% | 22 |
Central Hospital | 358 | 165 | 46.1% | 22 | 193 | 53.9% | 22 |
Other | 685 | 290 | 42.3% | 21 | 395 | 57.7% | 22 |
Military Hospital | 708 | 309 | 43.6% | 22 | 399 | 56.4% | 21 |
Ausente | 1,125 | 514 | 45.7% | 21 | 611 | 54.3% | 21 |
Port Hospital | 1,364 | 579 | 42.4% | 21 | 785 | 57.6% | 22 |
Total | 4,565 | 1,983 | 43.4% | 21 | 2,582 | 56.6% | 22 |
29.5 Como salvar sua tabela
Há diferentes caminhos para que sua tabela seja integrada em uma saída (output).
Como salvar uma tabela única
Você pode exportar as tabelas como arquivos para Word, PowerPoint ou HTML ou como arquivo de imagem (PNG). Para fazer isto, você pode usar uma das seguintes funções:
save_as_docx()
save_as_pptx()
save_as_image()
save_as_html()
Por exemplo, abaixo salvamos nossa tabela como um documento do word. Observe a sintaxe do primeiro argumento - você pode apenas fornecer o nome do seu objeto flextable, por exemplo my_table
, ou poderá dar um “nome” como apresentado a seguir (o nome é “my table”). Se for nome, este aparecerá como o título da tabela no Word. Também demonstramos comando para salvar como imagem PNG.
# Editar a 'my table' como necessário para adicionar o título na tabela
. save_as_docx("my table" = my_table, path = "file.docx")
save_as_image(my_table, path = "file.png")
Observe que os pacotes webshot
or webshot2
são necessários para a “flextable” como uma imagem. As imagens poderá sair com fundo transparente.
Se quiser ver uma versão ‘ao vivo’ da saída flexível no formato de documento pretendido, utilize print()
e especifique uma das seguintes opções abaixo para preview =
. O documento será aberto uma “pop-up” em um programa de software especificado no seu computador, mas não será salvo. Isto pode ser útil para verificar se a tabela cabe numa página/slide ou para que possa copiar rapidamente dentro de outro documento. Você pode, por exemplo, utilizar esse método com o argumento preview =
definido para “pptx” ou “docx” como mostrado abaixo.
print(my_table, preview = "docx") # Exemplo documento do Word
print(my_table, preview = "pptx") # Exemplo Powerpoint
Imprimir a tabela no R markdown
Esta tabela poderá ser integrada em um documento automatizado, uma saída R markdown, se o objeto tabela for chamado dentro do chunk do R markdown. Isto significa que a tabela poderá ser atualizada como parte de um relatório em que os dados podem ser alterados, e os números podem ser atualizados.
Veja detalhes na seção Relatórios com R Markdown deste manual.
29.6 Recursoa
O manual completo flextable se encontra aqui
O site Github pode ser encontrado aqui
O manual com todas a funções usadas no pacote flextable poderá ser encontrada aqui
Uma galeria com bons modelos de tabela flextable com códigos pode ser acessada aqui