首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GTSummary中分组行

在GTSummary中分组行
EN

Stack Overflow用户
提问于 2021-01-11 10:50:55
回答 2查看 2.3K关注 0票数 3

我正在尝试分组一些行/变量(包括分类的和连续的),以帮助在大型数据集中实现表的可读性。

下面是虚拟数据集:

代码语言:javascript
复制
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()

然后使用以下代码生成我的表:

代码语言:javascript
复制
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包,并使用以下代码:

代码语言:javascript
复制
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作为统计报告的输出文档,并希望能够在需要时(或由我的合作者)格式化这些表。我通常使用gtsummary::as_flextable进行表输出。

再次感谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-11 14:33:13

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

有两种方法可以这样做: 1.为每个组构建单独的表,然后将它们堆叠起来;2.向.$table_body添加一个分组列,然后根据新变量对tibble进行分组。

代码语言:javascript
复制
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,
    groupname_col = case_when(variable == "age" ~ "Deomgraphics",
                              variable == "grade" ~ "Tumor Characteristics")
  )

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

上面的示例在导出成gt格式之前修改了表,因此您可以将这些示例导出到可挠性的。但是,flextable没有相同的内置标题行功能(或者至少我不知道它,也没有在as_flex_table()中使用它),输出将类似于下面的表。我建议从GitHub安装gt的开发版本,并导出到RTF (由Word支持)--在过去的几个月中,他们对RTF输出进行了许多更新,并且可能对您有用。

票数 4
EN

Stack Overflow用户

发布于 2022-06-22 13:40:37

我想我可能有一个解决方案(很明显,感谢丹尼尔·肖伯格和团队为我们提供了modify_table_body功能)

您所需要做的就是编辑底层数据框架,使用modify_table_body添加一个带有您想要的分组行的变量,然后将它放在您希望它位于的位置,如下所示:

代码语言:javascript
复制
library(gtsummary)
library(dplyr)
packageVersion("gtsummary")

trial%>%
 select(age, stage, grade)%>%
 tbl_summary()%>%
 modify_table_body(
  ~.x %>% 
  
  # add your variable
  rbind(
    tibble(
      variable="Demographics",
      var_type=NA,
      var_label = "Demographics",
      row_type="label",
      label="Demographics",
      stat_0= NA))%>% # expand the components of the tibble as needed if you have more columns
  
  # can add another one
    rbind(
      tibble(
        variable="Tumor characteristics",
        var_type=NA,
        var_label = "Tumor characteristics",
        row_type="label",
        label="Tumor characteristics",
        stat_0= NA))%>%  
    
  # specify the position you want these in
    
  arrange(factor(variable, levels=c("Demographics",
                                    "age",
                                    "Tumor characteristics",
                                    "stage",
                                    "grade"))))%>%

# and you can then indent the actual variables
modify_column_indent(columns=label, rows=variable%in%c("age",
                                                      "stage",
                                                      "grade"))%>%

# and double indent their levels
modify_column_indent(columns=label, rows= (variable%in%c("stage",
                                                      "grade") 
                                             & row_type=="level"),
                     double_indent=T)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65665465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档