在Quarto中为R表格添加左侧额外行标题层的实现方法
在Quarto中为表格左侧添加带旋转效果的行分组标题
问题背景
需要在Quarto的表格左侧添加类似列分组标题(add_header_above()实现)的行分组标题,且要求分组文本可以旋转90度,现有kable的近似方法无法实现旋转效果,表格工具不局限于kable。
解决方案1:用kableExtra结合CSS实现行分组与旋转
通过pack_rows()创建行分组,利用CSS属性实现文本旋转,无需手动修改数据框结构:
library(kableExtra) df<-data.frame(x1=c(1,2,3,1), x2=c(2,4,6,2), x3=c(3,2,5,1), x4=c(2,3,4,4)) rownames(df)<-c("y1", "y2", "y3", "y4") kable(df, booktabs=T) %>% add_header_above(c(" "=1, "Group1"=2, "Group2"=2)) %>% # 创建行分组并通过CSS设置文本旋转与对齐 pack_rows( index = c("Group1" = 2, "Group2" = 2), label_row_css = "vertical-align: middle; text-align: center; writing-mode: vertical-rl;", background = "white" ) %>% column_spec(column = 1, bold=T, border_right = "1px solid lightgray") %>% row_spec(0, bold = TRUE) # 可选:为顶部列分组标题加粗
writing-mode: vertical-rl实现文本竖排(等同于旋转90度的视觉效果)pack_rows()自动完成行分组,无需手动调整行名或拼接数据
解决方案2:用gt包实现更灵活的样式控制
gt包对行分组和文本旋转的支持更直观,无需依赖额外CSS:
library(gt) df<-data.frame( group = rep(c("Group1", "Group2"), each=2), y = c("y1", "y2", "y3", "y4"), x1=c(1,2,3,1), x2=c(2,4,6,2), x3=c(3,2,5,1), x4=c(2,3,4,4) ) gt(df) %>% # 设置顶部列分组标题 tab_spanner(label = "Group1", columns = c(x1, x2)) %>% tab_spanner(label = "Group2", columns = c(x3, x4)) %>% # 配置行分组及旋转效果 row_group_order(groups = c("Group1", "Group2")) %>% opt_row_group_styling( label_align = "center", label_text_transform = function(x) rotate_text(x, angle = 90) ) %>% # 调整y列样式:加粗+右侧边框 cols_style( columns = y, font_weight = "bold", text_transform = function(x) html("<span style='border-right:1px solid lightgray; padding-right:8px;'>", x, "</span>") ) %>% cols_hide(columns = group) %>% # 隐藏用作分组的原始列 opt_table_style(style = "booktabs") # 匹配booktabs表格风格
rotate_text()可直接设置旋转角度,无需手写CSStab_spanner()与行分组功能配合,快速实现对称的表格分组结构
内容的提问来源于stack exchange,提问作者gecko
相关产品推荐
相关产品推荐

