合并多个卡方检验结果表并保留表头及添加P值
卡方检验表格合并:层级表头与P值添加方案
方案一:使用gt包生成带层级表头与P值的合并表格
gt包能轻松构建多层级表头,并支持在表格下方添加自定义注释(如卡方检验P值),适合生成可用于报告的美观表格。
步骤1:准备数据(替换为你的NN、BB、FF表格)
set.seed(123) # 模拟NN组观测/期望频数与卡方检验结果 nn_obs <- table(sample(c("A","B"), 100, replace=T), sample(c("X","Y"), 100, replace=T)) nn_exp <- chisq.test(nn_obs)$expected nn_ftable <- ftable(rbind(Observed=nn_obs, Expected=nn_exp)) nn_p <- chisq.test(nn_obs)$p.value # 模拟BB组 bb_obs <- table(sample(c("A","B"), 120, replace=T), sample(c("X","Y"), 120, replace=T)) bb_exp <- chisq.test(bb_obs)$expected bb_ftable <- ftable(rbind(Observed=bb_obs, Expected=bb_exp)) bb_p <- chisq.test(bb_obs)$p.value # 模拟FF组 ff_obs <- table(sample(c("A","B"), 90, replace=T), sample(c("X","Y"), 90, replace=T)) ff_exp <- chisq.test(ff_obs)$expected ff_ftable <- ftable(rbind(Observed=ff_obs, Expected=ff_exp)) ff_p <- chisq.test(ff_obs)$p.value
步骤2:合并表格并构建层级表头
library(gt) library(dplyr) library(glue) # 将每个ftable转为数据框并添加分组标识 nn_df <- as.data.frame(nn_ftable) %>% mutate(Group = "NN") bb_df <- as.data.frame(bb_ftable) %>% mutate(Group = "BB") ff_df <- as.data.frame(ff_ftable) %>% mutate(Group = "FF") # 合并所有数据并调整列顺序 combined_df <- bind_rows(nn_df, bb_df, ff_df) %>% select(Group, Var1, Var2, Freq) # 构建带层级表头的表格 gt_table <- gt(combined_df) %>% # 为每个分组创建上层表头 tab_spanner( label = "NN组", columns = c(Var1, Var2, Freq)[combined_df$Group == "NN"] ) %>% tab_spanner( label = "BB组", columns = c(Var1, Var2, Freq)[combined_df$Group == "BB"] ) %>% tab_spanner( label = "FF组", columns = c(Var1, Var2, Freq)[combined_df$Group == "FF"] ) %>% # 添加各分组的卡方检验P值注释 tab_source_note( source_note = glue("NN组卡方检验P值: {round(nn_p, 4)}; BB组卡方检验P值: {round(bb_p, 4)}; FF组卡方检验P值: {round(ff_p, 4)}") ) %>% # 格式化频数列保留两位小数 fmt_number(columns = Freq, decimals = 2) %>% # 自定义底层表头名称 cols_label( Var1 = "类别1", Var2 = "类别2", Freq = "频数" ) # 输出表格 gt_table
方案二:使用gridExtra横向合并独立分组表格
如果需要每个分组单独展示(含自身标题与P值),可以用gridExtra将三个独立表格横向拼接,避免cbind丢失表头结构。
library(gridExtra) library(grid) # 定义生成单分组表格的函数 make_group_table <- function(ftab, p_val, group_name) { df <- as.data.frame(ftab) # 创建表格对象 tbl <- tableGrob(df, rows = NULL, theme = ttheme_default(base_size = 10)) # 添加分组标题与P值注释 title <- textGrob(paste0(group_name, "组"), gp = gpar(fontsize=12, fontface="bold")) p_note <- textGrob(paste0("P值: ", round(p_val,4)), gp = gpar(fontsize=9)) # 组合标题、表格、注释 grid.arrange(title, tbl, p_note, ncol=1, heights=c(0.1, 0.8, 0.1)) } # 生成三个分组的表格对象 nn_tbl <- make_group_table(nn_ftable, nn_p, "NN") bb_tbl <- make_group_table(bb_ftable, bb_p, "BB") ff_tbl <- make_group_table(ff_ftable, ff_p, "FF") # 横向合并三个表格 grid.arrange(nn_tbl, bb_tbl, ff_tbl, ncol=3, widths=c(1,1,1))
关键说明
直接用cbind合并ftable会丢失其层级表头属性,因为cbind仅保留基本数据结构。上述两种方案通过专业表格处理工具,既能保留层级表头,又能灵活添加卡方检验P值注释。
内容的提问来源于stack exchange,提问作者Smuts94
相关产品推荐
相关产品推荐

