如何在R中创建带条件格式与行列总计的表格并复制指定表格
如何用R实现带条件格式与行列总计的表格
针对你需要复制「数据区域应用条件格式、行列总计部分不应用条件格式」的表格需求,推荐使用gt包来实现——它对表格格式的定制能力极强,能轻松满足你的要求。以下是结合你提供的代码的完整实现步骤:
步骤1:整理数据结构
首先需要把分组统计数据、行总计、列总计整合为适合表格展示的宽格式:
library(tidyverse) library(gt) # 原始数据生成代码 dates <- rep(date_vec <- c(as.Date("2022-01-01"), as.Date("2022-02-01"), as.Date("2022-03-01")), 30) row_groups <- c(rep("row_group1", 20), rep("row_group2", 30), rep("row_group3", 10), rep("row_group4", 30)) col_groups <- c(rep("col_group1", 10), rep("col_group2", 10), rep("col_group3", 30), rep("col_group4", 40)) df <- tibble(dates, row_groups, col_groups) # 列总计计算 col_group_total <- df %>% group_by(dates, col_groups) %>% count() %>% group_by(col_groups) %>% summarise(mean = mean(n)) %>% mutate(pct = mean/sum(mean)) # 行总计计算 row_group_total <- df %>% group_by(dates, row_groups) %>% count() %>% group_by(row_groups) %>% summarise(mean = mean(n)) %>% mutate(pct = mean/sum(mean)) %>% ungroup() # 核心表格数据计算 group_total <- df %>% group_by(dates, row_groups, col_groups) %>% count() %>% group_by(row_groups, col_groups) %>% summarise(count = mean(n)) %>% ungroup() %>% mutate(pct = count/sum(count)) %>% ungroup() # 定义条件格式颜色 red_color <- "#f4cccc" yellow_color <- "#f3f0ce" green_color <- "#d9ead3" # 转换为宽格式,合并行、列总计 table_wide <- group_total %>% pivot_wider(names_from = col_groups, values_from = pct) %>% # 添加行总计列 left_join(row_group_total %>% select(row_groups, pct), by = "row_groups") %>% rename(`行总计` = pct) %>% # 添加列总计行 add_row( row_groups = "列总计", col_group1 = col_group_total$pct[col_group_total$col_groups == "col_group1"], col_group2 = col_group_total$pct[col_group_total$col_groups == "col_group2"], col_group3 = col_group_total$pct[col_group_total$col_groups == "col_group3"], col_group4 = col_group_total$pct[col_group_total$col_groups == "col_group4"], `行总计` = sum(row_group_total$pct) )
步骤2:用gt构建带条件格式的表格
接下来使用gt包创建表格,精准控制条件格式的应用范围:
gt_table <- table_wide %>% gt(rowname_col = "row_groups") %>% # 仅对非总计行、非总计列的数据应用条件格式 data_color( columns = c(col_group1, col_group2, col_group3, col_group4), rows = row_groups != "列总计", colors = scales::col_numeric( palette = c(red_color, yellow_color, green_color), domain = range(table_wide %>% filter(row_groups != "列总计") %>% select(-row_groups, -`行总计`)) ) ) %>% # 将所有数值格式化为百分比 fmt_percent(columns = everything(), decimals = 1) %>% # 设置表格标题 tab_header(title = "分组统计表格(带条件格式与总计)") %>% # 高亮总计行和总计列,增强区分度 tab_style( style = cell_fill(color = "#e6e6e6"), locations = list( cells_rows(row_groups == "列总计"), cells_columns(columns = `行总计`) ) ) %>% # 给行名称添加加粗样式 tab_style( style = cell_text(weight = "bold"), locations = cells_row_groups() ) # 输出表格 gt_table
关键细节说明
- 条件格式范围控制:通过
rows = row_groups != "列总计"和指定数据列,确保只有核心数据区域应用颜色渐变,行列总计完全不受影响。 - 总计区分:用浅灰色背景高亮总计行和列,让表格结构更清晰。
- 格式统一:
fmt_percent将所有数值转为百分比显示,提升表格可读性。
如果需要导出表格为HTML或PDF文件,可使用gtsave(gt_table, "统计表格.html")或gtsave(gt_table, "统计表格.pdf")命令完成导出。
内容的提问来源于stack exchange,提问作者The Rookie
相关产品推荐
相关产品推荐

