具有分类变量总计的 R gtsummary 行

R gtsummary 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 ,missing = "no",
                label = list(
                 siteidn = "Number of ICUs"),
            statistic = list(
              all_continuous() ~ "{mean} ({sd})",
              all_categorical() ~ "{n} ({p}%)")) %>% 
      bold_labels() %>% 
      italicize_levels()

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

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

这会产生以下结果 table:

Table 1

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

我的问题是:

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

感谢大家的宝贵时间。

ADDIT:这是我希望 table 看起来像的图像。我为它的粗鲁道歉。我只想为 ICU 总数的因子变量设置一行,而不是为每个 ICU 设置一行,其中包含患者数量(红色墨水)。

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

我很感激我的 R 技能很粗鲁。谢谢大家的耐心等待!

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

  1. Is there a way to get a total row for a factor variable that is not the patient number?

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

  1. Is it possible to have an overall column inserted after merging the tables (so that the overall column does not come under the Country heading)?

是的,您可以使用 modify_spanning_header() 函数删除 Overall 列上方的 header。

  1. Is there a way to create a row for the number of patients and not have those details in the headings?

是的,如果您在数据集中创建一个对所有观察结果都为 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"), 100, replace = TRUE) %>% factor(),
    hospt = sample(c("Metro", "Rural"), 100, replace = TRUE) %>% factor(),
    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, siteidn, hospt) %>% 
  tbl_summary(
    by = hospt,
    missing = "no", 
    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

编辑:经过原始发帖者的澄清后,添加另一个如何呈现 Ns 的示例。

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

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