R gtsummary tbl_summary со слоями и двумя независимыми группирующими переменными

Я пытаюсь создать 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.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
144
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Надеюсь, это то, что вам нужно!

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()
Характеристика б = нет б = да с = сыр в = стейк д 19 0 (0%) 1 (14%) 1 (25%) 0 (0%) 22 0 (0%) 2 (29%) 1 (25%) 1 (17%) 27 0 (0%) 1 (14%) 1 (25%) 0 (0%) 38 0 (0%) 1 (14%) 0 (0%) 1 (17%) 44 0 (0%) 1 (14%) 0 (0%) 1 (17%) 47 1 (33%) 0 (0%) 0 (0%) 1 (17%) 56 1 (33%) 0 (0%) 0 (0%) 1 (17%) 61 1 (33%) 0 (0%) 0 (0%) 1 (17%) 82 0 (0%) 1 (14%) 1 (25%) 0 (0%)

# 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

Другие вопросы по теме

Измените аргумент статистики так, чтобы дихотомические переменные показывали количество обоих проявлений, разделенных косой чертой (/)
Ошибка Gtsummary при использовании tbl_merge: «Невозможно преобразовать из `y$modify_stat_N` <double> в `x$modify_stat_N` <integer> из-за потери точности»
Удалить метку переменной при использовании tbl_strata() и tbl_summary() из пакета gtsummary
Gtsummary: можно ли добавить «n» для каждого столбца таблицы, если tbl_summary разделена на две группы?
Добавление значений p в сводку таблицы
Как указать ковариаты в gtsummary ANCOVA
Как я могу создать перекрестную таблицу по нескольким переменным в R?
Как отсортировать сгруппированные строки таблицы частот с помощью пакета gtsummary в R?
Код для автоматизации нескольких моделей glmer и сравнения различных зависимых переменных
Добавление нового столбца в вывод gtsummary tbl_regression, рассчитанный с использованием существующих столбцов