gtsummary 多个测量的分层汇总表

问题描述 投票:0回答:1

我有每个测量值(SYSBP、DIABP 等)多个时间点(0H、4H、8H 等)的生命体征数据。数据以长格式组织如下

data <- structure(list(SUBJID = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), VSTESTCD = c("HR", 
"TEMP", "SYSBP", "DIABP", "RESP", "HR", "SYSBP", "DIABP", "RESP", 
"HR", "SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", 
"RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP", "HR", "TEMP", 
"SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP", 
"HR", "SYSBP", "DIABP", "RESP", "HR", "SYSBP", "DIABP", "RESP", 
"HR", "TEMP", "SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", 
"DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP", "HR", 
"TEMP", "SYSBP", "DIABP", "RESP", "HR", "SYSBP", "DIABP", "RESP", 
"HR", "SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", 
"RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP", "HR", "TEMP", 
"SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP", 
"HR", "SYSBP", "DIABP", "RESP", "HR", "SYSBP", "DIABP", "RESP", 
"HR", "TEMP", "SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", 
"DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP"), APERIODC = c("Period 1", 
"Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
"Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
"Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
"Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
"Period 1", "Period 1", "Period 1", "Period 2", "Period 2", "Period 2", 
"Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
"Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
"Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
"Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
"Period 2", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
"Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
"Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
"Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
"Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 2", 
"Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
"Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
"Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
"Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
"Period 2", "Period 2", "Period 2"), VSSTRESN = c(66, 36.5, 119, 
78, 16, 67, 120, 77, 17, 69, 121, 79, 16, 70, 36.5, 122, 82, 
17, 69, 36.5, 123, 83, 17, 69, 36.5, 121, 79, 17, 68, 36.6, 120, 
77, 17, 68, 121, 77, 17, 70, 123, 77, 17, 72, 36.5, 122, 79, 
17, 71, 36.5, 124, 81, 16, 69, 36.6, 122, 80, 18, 69, 36.6, 121, 
80, 18, 67, 120, 79, 18, 69, 119, 78, 17, 68, 36.5, 121, 80, 
18, 65, 36.6, 121, 80, 18, 70, 36.6, 121, 79, 18, 72, 36.6, 121, 
80, 16, 69, 121, 80, 17, 66, 119, 78, 18, 68, 36.6, 120, 79, 
18, 68, 36.6, 120, 79, 18, 67, 36.5, 119, 77, 17), VSTPT = c("0H", 
"0H", "0H", "0H", "0H", "4H", "4H", "4H", "4H", "8H", "8H", "8H", 
"8H", "12H", "12H", "12H", "12H", "12H", "24H", "24H", "24H", 
"24H", "24H", "36H", "36H", "36H", "36H", "36H", "0H", "0H", 
"0H", "0H", "0H", "4H", "4H", "4H", "4H", "8H", "8H", "8H", "8H", 
"12H", "12H", "12H", "12H", "12H", "24H", "24H", "24H", "24H", 
"24H", "36H", "36H", "36H", "36H", "36H", "0H", "0H", "0H", "0H", 
"0H", "4H", "4H", "4H", "4H", "8H", "8H", "8H", "8H", "12H", 
"12H", "12H", "12H", "12H", "24H", "24H", "24H", "24H", "24H", 
"36H", "36H", "36H", "36H", "36H", "0H", "0H", "0H", "0H", "0H", 
"4H", "4H", "4H", "4H", "8H", "8H", "8H", "8H", "12H", "12H", 
"12H", "12H", "12H", "24H", "24H", "24H", "24H", "24H", "36H", 
"36H", "36H", "36H", "36H")), row.names = c(NA, -112L), class = c("tbl_df", 
"tbl", "data.frame"))

我的目标是在 gtsummary 中为下面的每个 VSTESCD 和每个 VSTPT 构建一个表。 desired table format

我尝试使用嵌套功能,但没有收到想要的结果

data |>
  select(SUBJID, VSTESTCD, APERIODC, VSSTRESN, VSTPT) |>
  nest(data = -c(VSTPT, VSTESTCD)) |> 
  rowwise() |> 
  mutate(
    tbl = 
      data |>
      tbl_summary(
        by = APERIODC,
        digits = all_continuous() ~ 2,
        include = -SUBJID,
        type = VSSTRESN ~ "continuous",
        statistic = VSSTRESN ~ "{mean} ({sd})",
        label = list(VSSTRESN = VSTPT)
      )  |>
      modify_header(list(
        label ~ "**Test**",
        all_stat_cols() ~ "**{level}**, N = {n}"
      )) |> 
      list()
  ) |> 
  pull(tbl) |> 
  tbl_stack() |> 
  modify_spanning_header(all_stat_cols() ~ "**Stage**") |> 
  modify_table_body( ~.x |> dplyr::relocate(stat_1, .before = stat_2))

有人可以建议如何调整代码吗?

summary gtsummary
1个回答
0
投票

我会这样做!

library(gtsummary)

data <- structure(list(SUBJID = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
                                  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
                                  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
                                  1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
                                  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
                                  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), VSTESTCD = c("HR", 
                                                                                                "TEMP", "SYSBP", "DIABP", "RESP", "HR", "SYSBP", "DIABP", "RESP", 
                                                                                                "HR", "SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", 
                                                                                                "RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP", "HR", "TEMP", 
                                                                                                "SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP", 
                                                                                                "HR", "SYSBP", "DIABP", "RESP", "HR", "SYSBP", "DIABP", "RESP", 
                                                                                                "HR", "TEMP", "SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", 
                                                                                                "DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP", "HR", 
                                                                                                "TEMP", "SYSBP", "DIABP", "RESP", "HR", "SYSBP", "DIABP", "RESP", 
                                                                                                "HR", "SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", 
                                                                                                "RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP", "HR", "TEMP", 
                                                                                                "SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP", 
                                                                                                "HR", "SYSBP", "DIABP", "RESP", "HR", "SYSBP", "DIABP", "RESP", 
                                                                                                "HR", "TEMP", "SYSBP", "DIABP", "RESP", "HR", "TEMP", "SYSBP", 
                                                                                                "DIABP", "RESP", "HR", "TEMP", "SYSBP", "DIABP", "RESP"), APERIODC = c("Period 1", 
                                                                                                                                                                       "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
                                                                                                                                                                       "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
                                                                                                                                                                       "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
                                                                                                                                                                       "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
                                                                                                                                                                       "Period 1", "Period 1", "Period 1", "Period 2", "Period 2", "Period 2", 
                                                                                                                                                                       "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
                                                                                                                                                                       "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
                                                                                                                                                                       "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
                                                                                                                                                                       "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
                                                                                                                                                                       "Period 2", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
                                                                                                                                                                       "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
                                                                                                                                                                       "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
                                                                                                                                                                       "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", 
                                                                                                                                                                       "Period 1", "Period 1", "Period 1", "Period 1", "Period 1", "Period 2", 
                                                                                                                                                                       "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
                                                                                                                                                                       "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
                                                                                                                                                                       "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
                                                                                                                                                                       "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", "Period 2", 
                                                                                                                                                                       "Period 2", "Period 2", "Period 2"), VSSTRESN = c(66, 36.5, 119, 
                                                                                                                                                                                                                         78, 16, 67, 120, 77, 17, 69, 121, 79, 16, 70, 36.5, 122, 82, 
                                                                                                                                                                                                                         17, 69, 36.5, 123, 83, 17, 69, 36.5, 121, 79, 17, 68, 36.6, 120, 
                                                                                                                                                                                                                         77, 17, 68, 121, 77, 17, 70, 123, 77, 17, 72, 36.5, 122, 79, 
                                                                                                                                                                                                                         17, 71, 36.5, 124, 81, 16, 69, 36.6, 122, 80, 18, 69, 36.6, 121, 
                                                                                                                                                                                                                         80, 18, 67, 120, 79, 18, 69, 119, 78, 17, 68, 36.5, 121, 80, 
                                                                                                                                                                                                                         18, 65, 36.6, 121, 80, 18, 70, 36.6, 121, 79, 18, 72, 36.6, 121, 
                                                                                                                                                                                                                         80, 16, 69, 121, 80, 17, 66, 119, 78, 18, 68, 36.6, 120, 79, 
                                                                                                                                                                                                                         18, 68, 36.6, 120, 79, 18, 67, 36.5, 119, 77, 17), VSTPT = c("0H", 
                                                                                                                                                                                                                                                                                      "0H", "0H", "0H", "0H", "4H", "4H", "4H", "4H", "8H", "8H", "8H", 
                                                                                                                                                                                                                                                                                      "8H", "12H", "12H", "12H", "12H", "12H", "24H", "24H", "24H", 
                                                                                                                                                                                                                                                                                      "24H", "24H", "36H", "36H", "36H", "36H", "36H", "0H", "0H", 
                                                                                                                                                                                                                                                                                      "0H", "0H", "0H", "4H", "4H", "4H", "4H", "8H", "8H", "8H", "8H", 
                                                                                                                                                                                                                                                                                      "12H", "12H", "12H", "12H", "12H", "24H", "24H", "24H", "24H", 
                                                                                                                                                                                                                                                                                      "24H", "36H", "36H", "36H", "36H", "36H", "0H", "0H", "0H", "0H", 
                                                                                                                                                                                                                                                                                      "0H", "4H", "4H", "4H", "4H", "8H", "8H", "8H", "8H", "12H", 
                                                                                                                                                                                                                                                                                      "12H", "12H", "12H", "12H", "24H", "24H", "24H", "24H", "24H", 
                                                                                                                                                                                                                                                                                      "36H", "36H", "36H", "36H", "36H", "0H", "0H", "0H", "0H", "0H", 
                                                                                                                                                                                                                                                                                      "4H", "4H", "4H", "4H", "8H", "8H", "8H", "8H", "12H", "12H", 
                                                                                                                                                                                                                                                                                      "12H", "12H", "12H", "24H", "24H", "24H", "24H", "24H", "36H", 
                                                                                                                                                                                                                                                                                      "36H", "36H", "36H", "36H")), row.names = c(NA, -112L), class = c("tbl_df", 
                                                                                                                                                                                                                                                                                                                                                        "tbl", "data.frame"))

df_tbls <-
  data |> 
  dplyr::filter(VSTESTCD %in% c("SYSBP", "DIABP")) |> # subsetting to get a smaller table 
  dplyr::mutate(VSTPT = factor(VSTPT, level = c("0H", "4H", "8H", "12H", "24H", "36H"))) |> 
  tidyr::nest(data = -VSTESTCD) |> 
  dplyr::mutate(
    tbl = 
      purrr::map(
        data,
        ~ .x |> 
          tbl_strata2(
            strata = c(VSTPT),
            \(df_subset, strata) {
              df_subset |> 
                tbl_summary(
                  by = APERIODC,
                  digits = all_continuous() ~ 2,
                  include = -SUBJID,
                  type = VSSTRESN ~ "continuous",
                  statistic = VSSTRESN ~ "{mean} ({sd})",
                  label = list(VSSTRESN = strata)
                ) |>
                modify_header(
                  label = "**Test**",
                  all_stat_cols() ~ "**{level}**"
                )
            },
            .combine_with = "tbl_stack",
            .combine_args = list(group_header = NULL)
          )
      )
  )

tbl_final <-
  tbl_stack(
    df_tbls$tbl,
    group_header = df_tbls$VSTESTCD
  ) |> 
  modify_header(groupname_col = "**Test**", label = "**Time**") |> 
  modify_spanning_header(all_stat_cols() ~ "**Stage**") |> 
  as_flex_table()
tbl_final

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.