R gsummary Row with Categorical Variable Totals

问题描述

我有一个包含大约 700,000 名患者的数据集,其中有医院站点 ID(因子变量)。我想创建一行,其中医院的数量是可见的(这与患者的数量是分开的)。除了整个列之外,我还有 3 个分类变量作为我的列。

目前,每个医院 ID 都有一个单独的行,其中包含每个站点中每个类别的患者数量

我的代码如下:

t1 <- PIR %>% 
  select(siteidn,countryname) %>% 
    tbl_summary(by = countryname,missing = "no",label = list(
                 siteidn = "Number of ICUs"),statistic = list(
              all_continuous() ~ "{mean} ({sd})",all_categorical() ~ "{n} ({p}%)")) %>%
  bold_labels() %>% 
  italicize_levels() %>% 
  add_overall()

t2 <- PIR %>% 
  select(siteidn,hospt) %>% 
    tbl_summary(by = hospt,all_categorical() ~ "{n} ({p}%)")) %>% 
      bold_labels() %>% 
      italicize_levels()

t3 <- PIR %>% 
  select(siteidn,iculevelname) %>% 
    tbl_summary(by = iculevelname,all_categorical() ~ "{n} ({p}%)")) %>% 
      bold_labels() %>% 
      italicize_levels()

tbl_merge(
  tbls = list(t1,t2,t3),tab_spanner = c("**Country**","**Hospital Type**","**ICU Level**"))

这会产生下表:

Table 1

可以看出,每个医院 ID 都有一个单独的行。我希望有一行,其中包含每一层医院数量的总数(即澳大利亚、新西兰、大都会等的医院总数)。

我的问题是:

  1. 有没有办法为不是患者编号的因子变量获取总计行?
  2. 合并表格后是否可以插入一个整体列(这样整体列不会出现在 Country 标题下)?
  3. 有没有办法为患者人数创建一行,而标题中没有这些详细信息?

感谢大家的时间。

ADDIT:这是我希望表格的外观图像。我为它的粗鲁道歉。我希望 ICU 总数的因子变量只有一行,而不是每个 ICU 都有一行,其中包含患者人数(红色墨水)。

此外,有没有办法将 2 行分组在一个类似于因子变量(绿色墨水)的公共标题下。

我很欣赏我的 R 技能很初级。感谢大家的耐心等待!

Table_Ideal

解决方法

我同意 Ben 的观点,包含一个我们可以在我们的机器上运行的数据集总是很好的,以及一个你想要的输出的例子。下面是一个代码示例,可以解决您的大部分问题。

  1. 有没有办法为不是患者编号的因子变量获取总计行?

我不确定您要在这里寻找什么。请提供更多详细信息。

  1. 合并表格后是否可以插入一个整体列(这样整体列不会出现在 Country 标题下)?

是的,您可以使用 modify_spanning_header() 函数删除“总体”列上方的标题。

  1. 有没有办法为患者人数创建一行,而标题中没有这些详细信息?

是的,如果您在数据集中创建一个对所有观察结果都为 TRUE 的新列,我们可以总结该列并报告 N。

此外,如果您只对单个变量进行交叉制表,则应查看 tbl_cross() 函数。它会自动添加总行数。

library(gtsummary)
library(tidyverse)
set.seed(20210108)

# create dummy dataset
PIR <- 
  tibble(
    siteidn = sample(c("1325","1324","1329"),100,replace = TRUE) %>% factor(),countryname = sample(c("NZ","Australia"),hospt = sample(c("Metro","Rural"),patient = TRUE
  ) %>%
  group_by(siteidn) %>%
  mutate(
    count_site = row_number() == 1L # one TRUE per site
  ) %>%
  ungroup() %>%
  labelled::set_variable_labels(siteidn = "Number of ICUs",# Assigning labels 
                                patient = "N")

t1 <- PIR %>% 
  select(patient,siteidn,countryname) %>% 
  tbl_summary(
    by = countryname,missing = "no",statistic = patient ~ "{n}" # only print N for the top row
  ) %>% 
  modify_header(stat_by = "**{level}**") %>% # Remove the Ns from the header row
  add_overall(col_label = "**Overall**")
t2 <- PIR %>% 
  select(patient,hospt) %>% 
  tbl_summary(
    by = hospt,statistic = patient ~ "{n}" # only print N for the top row
  ) %>%
  modify_header(stat_by = "**{level}**") # Remove the Ns from the header row

tbl <-
  tbl_merge(
    tbls = list(t1,t2),tab_spanner = c("**Country**","**Hospital Type**")
  ) %>%
  bold_labels() %>% 
  italicize_levels() %>%
  # remove spanning header for overall column,use `show_header_names(tbl)` to print column names
  modify_spanning_header(stat_0_1 ~ NA) %>%
  modify_footnote(everything() ~ NA) # remove footnote,as it's not informative in this setting

enter image description here

编辑:在从原始海报澄清之后,添加另一个如何呈现 Ns 的示例。

下表显示了两种显示患者 Ns 和站点数量的方法。第一行是两行,有两个变量,最后一行是信息可以在一行中呈现的方式。

t1 <- PIR %>% 
  select(patient,site_only = count_site,combination = count_site,statistic = list(c(patient,site_only) ~ "{n}",combination ~ "Site N {n}; Total N {N}")
  )

enter image description here