如何结合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
相关产品推荐
相关产品推荐

