使用R gtsummary等工具生成带频数行百分比的三维HTML表格咨询
三维交叉表(同时展示频数与行百分比)HTML输出方案
方案1:gtsummary实现(与常用二维表格语法兼容,优先推荐)
# 加载所需依赖包 library(gtsummary) library(vcd) library(dplyr) Arthritis |> # 指定Improved为三维表的分层维度 tbl_strata( strata = Improved, .tbl_fun = ~ .x |> # 生成剩余两个维度的交叉表,计算行百分比 tbl_cross( row = Treatment, col = Sex, percent = "row", label = list(Treatment = "治疗方案", Sex = "性别") ) |> # 自定义列名明确展示内容 modify_header( all_stat_cols() ~ "{level}<br>(n, %)" ) ) |> modify_caption("关节炎治疗效果交叉表(按改善程度分层)") |> # 转换为HTML格式输出 as_gt() |> gt::as_raw_html()
运行后会以Improved(改善程度)作为分层维度,每个分层下展示治疗方案与性别的二维交叉表,每个单元格同时显示频数和行百分比,最终输出标准HTML格式表格,样式可通过gtsummary的常规自定义函数调整。
方案2:kableExtra实现
# 加载所需依赖包 library(kableExtra) library(dplyr) library(tidyr) library(scales) library(vcd) # 先汇总计算每个单元格的频数与行百分比 stat_df <- Arthritis |> group_by(Treatment, Sex, Improved) |> summarise(n = n(), .groups = "drop_last") |> # 按治疗方案+改善程度为行维度计算行占比 mutate(row_pct = percent(n / sum(n), accuracy = 0.1)) |> # 合并频数与百分比为单元格展示内容 mutate(cell_val = paste0(n, " (", row_pct, ")")) |> select(-n, -row_pct) |> pivot_wider(names_from = Sex, values_from = cell_val) |> arrange(Improved, Treatment) # 生成带分组的三维HTML表格 stat_df |> kable( format = "html", col.names = c("治疗方案", "改善程度", "女性", "男性"), caption = "关节炎治疗效果交叉表" ) |> kable_styling(bootstrap_options = c("striped", "hover"), full_width = F) |> # 按改善程度折叠行分组,实现三维视觉效果 pack_rows(index = table(stat_df$Improved)) |> # 移除重复的改善程度列 remove_columns(2)
该方案通过折叠行分组实现三维视觉效果,Improved作为上层分组维度,下层展示治疗方案和性别交叉的统计值,样式可通过kableExtra的样式函数自定义。
内容的提问来源于stack exchange,提问作者HSC
相关产品推荐
相关产品推荐

