【问题标题】:R gtsummary Row with Categorical Variable Totals具有分类变量总计的 R gsummary 行
【发布时间】:2021-01-08 03:55:58
【问题描述】:

我有一个包含大约 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 1

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

我的问题是:

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

感谢大家的宝贵时间。

添加:这是我希望桌子看起来的图像。我为它的粗鲁道歉。我希望只有一行作为 ICU 总数的因子变量,而不是在每个 ICU 中都有一行包含其中的患者数量(红色墨水)。

此外,有没有一种方法可以将 2 行分组到一个类似于因子变量(Green Ink)的共同标题下。

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

【问题讨论】:

  • 欢迎来到 SO!如果您能够提供一些数据以使其成为reproducible example,这可能会有所帮助。为此,请尝试dput(head(PIR)) 并编辑您的帖子,然后复制/粘贴结果。此外,如果您能够澄清最终表/结果最终应该是什么样子,这将有所帮助。也许“模型”包括行和列是什么(不需要实际数据)。
  • 谢谢@Ben,下次我会努力的。我刚开始学习R,所以还是有点绿!

标签: r summary gtsummary tbl


【解决方案1】:

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

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

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

  1. 是否可以在合并表格后插入一个整体列(使整体列不在国家标题下)?

是的,您可以使用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"), 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 的示例。

下表显示了两种显示患者 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}")
  )

【讨论】:

  • 谢谢你,丹尼尔。我很感激。我已经编辑了帖子以包含一个基本表格。
  • @BenjaminMoran 我用另一个例子更新了我的帖子
  • 谢谢!!它奏效了。再次感谢您提供的超棒包裹!
猜你喜欢
  • 1970-01-01
  • 2021-03-26
  • 2017-04-14
  • 1970-01-01
  • 2013-04-29
  • 2013-03-22
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多