我有每个测量值(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 构建一个表。
我尝试使用嵌套功能,但没有收到想要的结果
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))
有人可以建议如何调整代码吗?
我会这样做!
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