You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并多个卡方检验结果表并保留表头及添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:57:38