Я пытаюсь создать tbl_summary
, который имеет категорию слоев и внутри каждой категории слоев две отдельные категориальные (вероятно, двоичные) переменные. Вот пример того, как я хочу, чтобы таблица была расположена, однако n/% для d
являются заполнителями и не соответствуют моему примеру набора данных.
Я не хочу объединять переменные b
и c
, поскольку это разные и независимые переменные для каждого наблюдения. Я попытался добиться желаемой структуры таблицы с помощью комбинации tbl_summary
, tbl_strata
и tbl_merge
, однако мне не удалось заставить ее работать правильно.
Вот мой минимальный пример (R v4.2.2
):
library(readr)
library(dplyr)
library(tidyverse)
library(gtsummary)
df <- data.frame(id=1:10,
a=c('red', 'blue', 'red', 'red', 'blue', 'red', 'blue', 'blue', 'blue', 'red'),
b=c('yes', 'yes', 'yes', 'no', 'yes', 'no', 'yes', 'yes', 'yes', 'no'),
c=c('cheese', 'cheese', 'steak', 'steak', 'cheese', 'steak', 'steak', 'cheese', 'steak', 'steak'),
d=c(22, 82, 44, 56, 27, 61, 22, 19, 38, 47)
)
df$a <- factor(df$a)
df$b <- factor(df$b)
df$c <- factor(df$c)
df$d <- factor(df$d)
t1 <- df %>%
select(a, b, d) %>%
mutate(a = paste("a = ", a)) %>%
mutate(b = paste("b = ", b)) %>%
tbl_strata(
strata = a,
.tbl_fun =
~ .x %>%
tbl_summary(by = b, missing = "no"),
.header = "**{strata}**, N = {n}"
)
t2 <- df %>%
select(a, c, d) %>%
mutate(a = paste("a = ", a)) %>%
mutate(c = paste("c = ", c)) %>%
tbl_strata(
strata = a,
.tbl_fun =
~ .x %>%
tbl_summary(by = c, missing = "no"),
.header = "**{strata}**, N = {n}"
)
tbl_merge(
tbls = list(t1, t2),
tab_spanner = c("**b**", "**c**")
)
Этот код создает таблицу, в которой нет правильных столбцов для b
и c
и отсутствует общая переменная слоя a
.
Некоторые дальнейшие попытки привели к правильному макету, но N/% неверны и дублируются между значениями слоев:
df <- data.frame(id=1:11,
a=c('red', 'blue', 'red', 'red', 'blue', 'red', 'blue', 'blue', 'blue', 'red', 'blue'),
b=c('yes', 'yes', 'yes', 'no', 'yes', 'no', 'yes', 'yes', 'yes', 'no', 'no'),
x=c('cheese', 'cheese', 'steak', 'steak', 'cheese', 'steak', 'steak', 'cheese', 'steak', 'steak', 'cheese'),
d=c(22, 82, 44, 56, 27, 61, 22, 19, 38, 47, 38)
)
df$a <- factor(df$a)
df$b <- factor(df$b)
df$x <- factor(df$x)
df$d <- factor(df$d)
t3 <- df %>%
select(b, d) %>%
mutate(b = paste("b = ", b)) %>%
tbl_summary(by = b,
missing = "no"
)
t4 <- df %>%
select(x, d) %>%
mutate(x = paste("x = ", x)) %>%
tbl_summary(by = x,
missing = "no"
)
df %>% tbl_strata(
strata = a,
.tbl_fun =
~tbl_merge(
tbls = list(t3, t4)
),
.header = "**a = {strata}**, N = {n}"
)
Я переместил tbl_strata
из каждой таблицы, чтобы он появлялся в объединенной версии, и передал tbl_merge
(который не является ~ .x %>%
) в tbl_strata
.
Это близко, если я смогу исправить значения d
, которые неправильно дублируются между значениями a
.
Надеюсь, это то, что вам нужно!
library(gtsummary)
packageVersion("gtsummary")
#> [1] '1.7.2'
df <- data.frame(id=1:10,
a=c('red', 'blue', 'red', 'red', 'blue', 'red', 'blue', 'blue', 'blue', 'red'),
b=c('yes', 'yes', 'yes', 'no', 'yes', 'no', 'yes', 'yes', 'yes', 'no'),
c=c('cheese', 'cheese', 'steak', 'steak', 'cheese', 'steak', 'steak', 'cheese', 'steak', 'steak'),
d=c(22, 82, 44, 56, 27, 61, 22, 19, 38, 47)
)
df$a <- factor(df$a)
df$b <- factor(df$b)
df$c <- factor(df$c)
df$d <- factor(df$d)
# first create a function to create half of the table
tbl_summary_half_merge <- function(data, by, include) {
purrr::map(
by,
~tbl_summary(data, by = all_of(.x), include = all_of(include)) |>
modify_header(all_stat_cols() ~ paste0("**", .x, " = {level}**"))
) |>
tbl_merge(tab_spanner = FALSE)
}
# testing our first function
tbl_summary_half_merge(df, by = c("b", "c"), include = "d") |> as_kable()
# now use that function with tbl_strata()
tbl <-
tbl_strata(
df,
strata = "a",
.tbl_fun =
~tbl_summary_half_merge(.x, by = c("b", "c"), include = "d"),
.header = "**a = {strata}**"
)
Created on 2024-04-30 with reprex v2.1.0