Группировка строк в GTSсводка

Я пытаюсь сгруппировать несколько строк / переменных (как категориальных, так и непрерывных), чтобы облегчить читаемость таблицы в большом наборе данных.

Вот фиктивный набор данных:

library(gtsummary)
library(tidyverse)
library(gt)
set.seed(11012021)

# Create Dataset
PIR <- 
  tibble(
    siteidn = sample(c("1324", "1329", "1333", "1334"), 5000, replace = TRUE, prob = c(0.2, 0.45, 0.15, 0.2)) %>% factor(),
    countryname = sample(c("NZ", "Australia"), 5000, replace = TRUE, prob = c(0.3, 0.7)) %>% factor(),
    hospt = sample(c("Metropolitan", "Rural"), 5000, replace = TRUE, prob = c(0.65, 0.35)) %>% factor(),
    age = rnorm(5000, mean = 60, sd = 20),
    apache2 = rnorm(5000, mean = 18.5, sd=10),
    apache3 = rnorm(5000, mean = 55, sd=20),
    mechvent = sample(c("Yes", "No"), 5000, replace = TRUE, prob = c(0.4, 0.6)) %>% factor(),
    sex = sample(c("Female", "Male"), 5000, replace = TRUE) %>% factor(),
    patient = TRUE
  ) %>%
  mutate(patient_id = row_number())%>% 
  group_by(
    siteidn) %>% mutate(
      count_site = row_number() == 1L) %>%
  ungroup()%>% 
  group_by(
    patient_id) %>% mutate(
      count_pt = row_number() == 1L) %>%
  ungroup()

Затем я использую следующий код для создания своей таблицы:

t1 <- PIR %>% 
  select(patientn = count_pt, siten = count_site, age, sex, apache2, apache3,  apache2, mechvent, countryname) %>% 
  tbl_summary(
    by = countryname,
    missing = "no", 
    statistic = list(
      patientn ~ "{n}",
      siten ~ "{n}",
      age ~ "{mean} ({sd})",
      apache2 ~ "{mean} ({sd})",
      mechvent ~ "{n} ({p}%)",
      sex ~ "{n} ({p}%)",
      apache3 ~ "{mean} ({sd})"),
    label = list(
      siten = "Number of ICUs",
      patientn = "Number of Patients",
      age = "Age",
      apache2 = "APACHE II Score",
      mechvent = "Mechanical Ventilation",
      sex = "Sex",
      apache3 = "APACHE III Score")) %>% 
  modify_header(stat_by = "**{level}**") %>%
  add_overall(col_label = "**Overall**")
  
t2 <- PIR %>% 
  select(patientn = count_pt, siten = count_site, age, sex, apache2, apache3,  apache2, mechvent, hospt) %>% 
  tbl_summary(
    by = hospt,
    missing = "no", 
     statistic = list(
      patientn ~ "{n}",
      siten ~ "{n}",
      age ~ "{mean} ({sd})",
      apache2 ~ "{mean} ({sd})",
      mechvent ~ "{n} ({p}%)",
      sex ~ "{n} ({p}%)",
      apache3 ~ "{mean} ({sd})"),
    label = list(
      siten = "Number of ICUs",
      patientn = "Number of Patients",
      age = "Age",
      apache2 = "APACHE II Score",
      mechvent = "Mechanical Ventilation",
      sex = "Sex",
      apache3 = "APACHE III Score")) %>%  
  modify_header(stat_by = "**{level}**")

tbl <-
  tbl_merge(
    tbls = list(t1, t2),
    tab_spanner = c("**Country**", "**Hospital Type**")
  ) %>%
  modify_spanning_header(stat_0_1 ~ NA) %>%
  modify_footnote(everything() ~ NA)

Это дает следующую таблицу:

Таблица 1

Я хотел бы сгруппировать определенные строки для удобства чтения. В идеале я бы хотел, чтобы таблица выглядела так:

Table 1 Ideal

Я попытался использовать пакет gt со следующим кодом:

tbl <-
  tbl_merge(
    tbls = list(t1, t2),
    tab_spanner = c("**Country**", "**Hospital Type**")
  ) %>%
  modify_spanning_header(stat_0_1 ~ NA) %>%
  modify_footnote(everything() ~ NA) %>% 
as_gt() %>%  
  gt::tab_row_group(
    group = "Severity of Illness Scores",
    rows = 7:8) %>%  
  gt::tab_row_group(
    group = "Patient Demographics",
    rows = 3:6) %>%  
  gt::tab_row_group(
    group = "Numbers",
    rows = 1:2)

Это создает желаемую таблицу:

Разделы Таблицы 1

У меня есть пара проблем с тем, как я это делаю.

  1. Когда я пытаюсь использовать имена строк (переменные), появляется сообщение об ошибке (Невозможно подмножество столбцов, которые не существуют ...). Есть ли способ сделать это с помощью имен переменных? С большими таблицами у меня возникают некоторые проблемы с использованием метода номеров строк для присвоения имен строк. Это особенно верно, когда есть одна переменная, которая теряет свое место при перемещении в конец для учета сгруппированных строк.

  2. Есть ли способ сделать это до подключения к tbl_summary? Хотя мне нравится вывод этой таблицы, я использую Word в качестве выходного документа для статистических отчетов и хотел бы иметь возможность форматировать таблицы в Word, если это необходимо (или моими соавторами). Я обычно использую gtsummary :: as_flextable для вывода таблицы.

Спасибо еще раз,

Бен


person Benjamin Moran    schedule 11.01.2021    source источник
comment
спасибо за то, что вы включили примеры, которые мы можем запустить на нашей машине, и примеры того, как вы хотите, чтобы результат выглядел. Следующие шаги - сделать ваши примеры минимальными. Вы можете узнать больше о минимальных воспроизводимых примерах здесь (это краткое чтение): correx.tidyverse.org   -  person Daniel D. Sjoberg    schedule 11.01.2021
comment
Спасибо. Я займусь этим.   -  person Benjamin Moran    schedule 12.01.2021


Ответы (1)


  1. Когда я пытаюсь использовать имена строк (переменные), появляется сообщение об ошибке (Невозможно подмножество столбцов, которые не существуют ...). Есть ли способ сделать это с помощью имен переменных? С большими таблицами у меня возникают проблемы с использованием метода номеров строк для присвоения имен строк. Это особенно верно, когда есть одна переменная, которая теряет свое место при перемещении в конец для учета сгруппированных строк.

Есть два способа сделать это: 1. создать отдельные таблицы для каждой группы, затем сложить их, и 2. добавить столбец группировки в .$table_body, а затем сгруппировать таблицу по новой переменной.

library(gtsummary)
library(dplyr)
packageVersion("gtsummary")
#> '1.3.6'

# Method 1 - Stack separate tables
t1 <- trial %>% select(age) %>% tbl_summary()
t2 <- trial %>% select(grade) %>% tbl_summary()

tbl1 <-
  tbl_stack(
    list(t1, t2), 
    group_header = c("Demographics", "Tumor Characteristics")
  ) %>%
  modify_footnote(all_stat_cols() ~ NA)

# Method 2 - build a grouping variable
tbl2 <-
  trial %>%
  select(age, grade) %>%
  tbl_summary() %>%
  modify_table_body(
    mutate,
    group_variable = case_when(variable == "age" ~ "Deomgraphics",
                               variable == "grade" ~ "Tumor Characteristics")
  ) %>%
  modify_table_body(group_by, group_variable)

введите описание изображения здесь

2. Есть ли способ сделать это до подключения к tbl_summary? Хотя мне нравится вывод этой таблицы, я использую Word в качестве выходного документа для статистических отчетов и хотел бы иметь возможность форматировать таблицы в Word, если это необходимо (или моими соавторами). Я обычно использую gtsummary :: as_flextable для вывода таблицы.

Приведенные выше примеры изменяют таблицу перед экспортом в формат gt, поэтому вы можете экспортировать этот пример в файл flextable. Однако у flextable нет такой же встроенной функциональности строки заголовка (или, по крайней мере, я не знаю об этом и не использую его в as_flex_table()), и результат будет выглядеть, как в таблице ниже. Я рекомендую установить версию gt для разработчиков с GitHub и экспортировать в RTF (поддерживается Word) - они сделали много обновлений для вывода RTF за последние месяцы, и это может сработать для вас.

введите описание изображения здесь

person Daniel D. Sjoberg    schedule 11.01.2021
comment
Еще раз спасибо за ответ. Я попытался использовать метод 2, который работал для одной таблицы, но когда я попытался объединить таблицы, сгруппированных строк больше не было. Если бы я использовал метод 1, мне пришлось бы построить 15 отдельных таблиц (3 объединенные для каждого уровня и 5 составных уровней). Вероятно, проще (и эффективнее по времени) использовать флештабируемый текст и вставлять строки в Word. Журнал, скорее всего, изменит формат таблицы. Я буду экспериментировать с тем, чему вы меня научили, и с тем, что я могу найти для экспорта через gt. Еще раз спасибо за вашу помощь. Это очень ценится. Бен - person Benjamin Moran; 12.01.2021