如何使用gt_summary包获取不同参与者最大值的标准差?
用gt_summary获取参与者最大值的标准差
要获取所有参与者最大值的标准差,需先计算每个参与者的指标最大值,再求这些最大值的标准差,最后将该统计量整合到gt_summary表格中。以下提供两种实现方式:
方式一:在Overall列补充最大值的标准差
此方式会在原有Overall列的统计文本后追加最大值的标准差信息,保持表格结构紧凑:
library(gtsummary) library(gt) library(tidyverse) # 生成可复现的示例数据 set.seed(123) df <- tibble(participant= rep(sprintf("A%02d",1:10),2), role= rep(c(rep("male",6),rep("female",4)),2), temp = sample(seq(36,38,by=0.1),20), humidity = sample(seq(50,80,by=1),20)) # 计算各指标的最大值的标准差 sd_max_df <- df %>% group_by(participant) %>% summarise(across(c(temp, humidity), max)) %>% # 提取每个参与者的指标最大值 summarise(across(everything(), sd)) %>% # 计算最大值的标准差 pivot_longer(everything(), names_to = "variable", values_to = "sd_max") # 生成汇总表格并整合统计量 tbl <- df %>% select(-role) %>% tbl_summary( by = participant, missing = "no", statistic = list(all_continuous() ~ "{mean} ± {sd} ({max})"), label = list(temp ~ "Core Temperature", humidity ~ "Humidity"), digits = list(temp ~ 1, humidity ~ 0) ) %>% add_overall() %>% modify_header(label = "**Parameters**", all_stat_cols() ~ "**{level}**") %>% bold_labels() %>% # 将最大值标准差追加到Overall列 modify_table_body( ~ .x %>% left_join(sd_max_df, by = "variable") %>% mutate( stat_overall = paste0(stat_overall, " | SD of max: ", sprintf(ifelse(variable == "temp", "%.1f", "%.0f"), sd_max)) ) %>% select(-sd_max) ) %>% as_gt() tbl
方式二:新增行单独显示最大值的标准差
此方式会在每个参数的下方新增一行,专门展示该参数所有参与者最大值的标准差,统计量更清晰:
library(gtsummary) library(gt) library(tidyverse) # 生成可复现的示例数据 set.seed(123) df <- tibble(participant= rep(sprintf("A%02d",1:10),2), role= rep(c(rep("male",6),rep("female",4)),2), temp = sample(seq(36,38,by=0.1),20), humidity = sample(seq(50,80,by=1),20)) # 计算各指标的最大值的标准差 sd_max_df <- df %>% group_by(participant) %>% summarise(across(c(temp, humidity), max)) %>% summarise(across(everything(), sd)) %>% pivot_longer(everything(), names_to = "variable", values_to = "sd_max") # 生成基础汇总表格 tbl <- df %>% select(-role) %>% tbl_summary( by = participant, missing = "no", statistic = list(all_continuous() ~ "{mean} ± {sd} ({max})"), label = list(temp ~ "Core Temperature", humidity ~ "Humidity"), digits = list(temp ~ 1, humidity ~ 0) ) %>% add_overall() %>% modify_header(label = "**Parameters**", all_stat_cols() ~ "**{level}**") %>% bold_labels() # 创建显示最大值标准差的新行 new_rows <- sd_max_df %>% mutate( label = case_when( variable == "temp" ~ "Core Temperature (SD of max)", variable == "humidity" ~ "Humidity (SD of max)" ), stat_overall = sprintf(ifelse(variable == "temp", "%.1f", "%.0f"), sd_max), # 其他参与者列留空 across(starts_with("stat_"), ~ ifelse(.col != "stat_overall", "", .x)) ) %>% select(label, variable, starts_with("stat_")) # 合并新行到原表格并调整顺序 tbl_final <- tbl %>% modify_table_body( ~ bind_rows(.x, new_rows) %>% arrange(match(variable, c("temp", "humidity"))) ) %>% as_gt() tbl_final
内容的提问来源于stack exchange,提问作者Jun Hao Kwek
相关产品推荐
相关产品推荐

