29  Tabelas para apresentação

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

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”.

pacman::p_load(
  rio,            # importar/exportar
  here,           # caminho do arquivo
  flextable,      # fazer tabelas HTML 
  officer,        # Funções auxiliares para tabelas
  tidyverse)      # visualização, resumo e gerenciamento dos dados 

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
linelist <- import("linelist_cleaned.rds")

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.

table <- linelist %>% 
  
  # 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
    hospital, N_Known,                                   # Colunas introdutórias
    N_Recover, Pct_Recover, ct_value_Recover,            # Coluna dos recuperados
    N_Death, Pct_Death, ct_value_Death)  %>%             # Coluna de óbitos
  arrange(N_Known)                                    # Organizar linhas da mais alta para mais baixa (linha superior a linha Total)

table  # impressão
# 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.

my_table <- flextable(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)`. 

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().

my_table %>% autofit()

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

my_table  # visualizar

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
border_style = officer::fp_border(color="black", width=1)

# 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 %>% 
   flextable::align(align = "center", j = c(2:8), part = "all") 
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().

my_table <- colformat_num(my_table, j = c(4,7), digits = 1)
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:

border_style = officer::fp_border(color="black", width=1)

pacman::p_load(
  rio,            # importar/exportar
  here,           # caminho do arquivo
  flextable,      # fazer tabelas HTML 
  officer,        # Funções auxiliares para tabelas
  tidyverse)      # visualização, resumo e gerenciamento dos dados

table <- linelist %>% 
  # 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
    hospital, N_Known,                                   # Colunas introdutórias
    N_Recover, Pct_Recover, ct_value_Recover,            # Coluna dos recuperados
    N_Death, Pct_Death, ct_value_Death)  %>%             # Coluna de óbitos
  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) %>% 
  flextable::align(., align = "center", j = c(2:8), part = "all") %>% 
  bg(., 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