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

如何结合kableExtra的pack_rows与add_header_above定制合并ANOVA表格样式

调整思路

你的代码核心问题是ANOVA表与对比表的列结构不匹配,直接合并会导致内容错位。需先统一两类表格的列结构,确保列数、列顺序完全一致后再合并,调整后完整代码如下:

library(emmeans)
library(kableExtra)
library(dplyr)

# 模型拟合与结果提取
warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks)
warp.jt <- joint_tests(warp.lm)
warp.ct <- print(contrast(emmeans(warp.lm, ~ tension, infer = c(F,T))), export = T) 

noise.lm <- lm(noise/10 ~ size * type * side, data = auto.noise)
noise.jt <- joint_tests(noise.lm)
noise.ct <- print(contrast(emmeans(noise.lm , ~ size, infer = c(F,T))), export = T) 

# 1. 整理ANOVA表,统一列结构:项名/ warp统计量 / warp p值 / noise统计量 / noise p值
warp.jt_clean <- warp.jt %>% 
  select(term, F.ratio, p.value) %>% 
  rename(item = term, stat_warp = F.ratio, p_warp = p.value) %>% 
  mutate(stat_noise = NA, p_noise = NA)

noise.jt_clean <- noise.jt %>% 
  select(term, F.ratio, p.value) %>% 
  rename(item = term, stat_noise = F.ratio, p_noise = p.value) %>% 
  mutate(stat_warp = NA, p_warp = NA) %>% 
  select(item, stat_warp, p_warp, stat_noise, p_noise)

anova_all <- rbind(warp.jt_clean, noise.jt_clean)

# 2. 整理对比表,匹配ANOVA表列结构
warp_ct_clean <- warp.ct$summary %>% 
  select(contrast, estimate, p.value) %>% 
  rename(item = contrast, stat_warp = estimate, p_warp = p.value)

noise_ct_clean <- noise.ct$summary %>% 
  select(estimate, p.value) %>% 
  rename(stat_noise = estimate, p_noise = p.value)

contrast_all <- cbind(warp_ct_clean, noise_ct_clean)

# 3. 合并两类表格
merge_tab <- rbind(anova_all, contrast_all)
rownames(merge_tab) <- NULL

# 4. 生成目标格式表格
merge_tab %>%
  # 将空值替换为空字符串,避免显示NA
  mutate(across(everything(), ~ifelse(is.na(.), "", as.character(.)))) %>%
  kbl(
    linesep = "",
    caption = "合并表格",
    col.names = c("对比项", "统计量", "p值", "统计量", "p值")
  ) %>%
  pack_rows("(A) - warp ANOVA", 1, nrow(warp.jt)) %>%
  pack_rows("(B) - noise ANOVA", nrow(warp.jt)+1, nrow(warp.jt)+nrow(noise.jt)) %>%
  pack_rows("(C) 对比结果", nrow(warp.jt)+nrow(noise.jt)+1, nrow(merge_tab)) %>%
  add_header_above(c(" " = 1, "Warp数据集" = 2, "Noise数据集" = 2)) %>%
  kable_styling(full_width = F)

如果不想加载dplyr,也可以用base R语法完成列整理、空值替换的操作,最终效果一致。

内容的提问来源于stack exchange,提问作者hnguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:36:00