具有分类变量总计的 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 都有单独的一行。我想要一行,其中包含每一层医院的总数(即澳大利亚、新西兰、大都会等的医院总数)。
我的问题是:
- 有没有办法获取不是患者编号的因子变量的总行?
- 是否可以在合并 table 后插入一个整体列(这样整体列就不会出现在“国家/地区”标题下)?
- 有没有办法为患者人数创建一行,而不在标题中包含这些详细信息?
感谢大家的宝贵时间。
本
ADDIT:这是我希望 table 看起来像的图像。我为它的粗鲁道歉。我只想为 ICU 总数的因子变量设置一行,而不是为每个 ICU 设置一行,其中包含患者数量(红色墨水)。
此外,有没有一种方法可以将 2 行分组在类似于因子变量(绿色墨水)的共同标题下。
我很感激我的 R 技能很粗鲁。谢谢大家的耐心等待!
本
我同意 Ben 的观点,最好在我们的机器上包含一个我们可以 运行 的数据集,以及您希望输出的示例。下面是一个代码示例,可以解决您的大部分问题。
- Is there a way to get a total row for a factor variable that is not the patient number?
我不确定您要在这里寻找什么。请提供更多详细信息。
- 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。
- 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}")
)
我有一个包含大约 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 都有单独的一行。我想要一行,其中包含每一层医院的总数(即澳大利亚、新西兰、大都会等的医院总数)。
我的问题是:
- 有没有办法获取不是患者编号的因子变量的总行?
- 是否可以在合并 table 后插入一个整体列(这样整体列就不会出现在“国家/地区”标题下)?
- 有没有办法为患者人数创建一行,而不在标题中包含这些详细信息?
感谢大家的宝贵时间。
本
ADDIT:这是我希望 table 看起来像的图像。我为它的粗鲁道歉。我只想为 ICU 总数的因子变量设置一行,而不是为每个 ICU 设置一行,其中包含患者数量(红色墨水)。
此外,有没有一种方法可以将 2 行分组在类似于因子变量(绿色墨水)的共同标题下。
我很感激我的 R 技能很粗鲁。谢谢大家的耐心等待!
本
我同意 Ben 的观点,最好在我们的机器上包含一个我们可以 运行 的数据集,以及您希望输出的示例。下面是一个代码示例,可以解决您的大部分问题。
- Is there a way to get a total row for a factor variable that is not the patient number?
我不确定您要在这里寻找什么。请提供更多详细信息。
- 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。
- 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}")
)