【问题标题】:Grouping Rows in GTSummary在 GTSummary 中对行进行分组
【发布时间】:2021-04-16 07:31:19
【问题描述】:

我正在尝试对一些行/变量(分类和连续)进行分组,以帮助提高大型数据集中的表格可读性。

这是虚拟数据集:

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)

这会产生下表:

我想将某些行组合在一起以便于阅读。理想情况下,我希望表格如下所示:

我尝试过使用 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. 当我尝试使用行名(变量)时,会出现一条错误消息(不能对不存在的列进行子集...)。有没有办法通过使用变量名来做到这一点?对于较大的表,我在使用分配行名的行号方法时遇到了一些麻烦。当有一个变量在移动到末尾以考虑分组行时丢失其位置时尤其如此。

  2. 在输入 tbl_summary 之前有没有办法做到这一点?虽然我喜欢这个表格的输出,但我使用 Word 作为统计报告的输出文档,并且希望能够在需要时(或由我的合作者)在 Word 中格式化表格。我通常使用 gtsummary::as_flextable 进行表格输出。

再次感谢,

【问题讨论】:

  • 感谢您提供我们可以在我们的机器上运行的示例以及您希望输出的示例。接下来的步骤是使您的示例最小化。您可以在此处阅读有关最小可重复示例的更多信息(这是一个简短的阅读):reprex.tidyverse.org
  • 谢谢。我会调查的。

标签: r summary gtsummary gt tbl


【解决方案1】:
  1. 当我尝试使用行名(变量)时,出现错误消息(不能对不存在的列进行子集...)。有没有办法通过使用变量名来做到这一点?对于较大的表,我在使用分配行名的行号方法时遇到了一些麻烦。当有一个变量在移动到末尾以考虑分组行时丢失其位置时尤其如此。

有两种方法可以解决这个问题,1. 为每个组构建单独的表,然后将它们堆叠起来,2. 将分组列添加到 .$table_body,然后按新变量对 tibble 进行分组。

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() 中使用它),输出如下表所示。我建议从 GitHub 安装 gt 的开发版本并导出到 RTF(由 Word 支持)——他们在过去几个月里对 RTF 输出进行了许多更新,它可能对你有用。

【讨论】:

  • 再次感谢您的回复。我尝试使用适用于单个表的方法 2,但是当我尝试合并表时,分组的行不再存在。如果我使用方法 1,我将必须构建 15 个单独的表(每个级别合并 3 个表和 5 个堆叠级别)。使用 flextable 并在 Word 中插入行可能更容易(也更省时)。期刊可能会更改表格的格式。我会玩弄你教给我的东西以及我可以通过 gt 导出的东西。再次感谢你的帮助。非常感谢。本
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
相关资源
最近更新 更多