如何在Reactable中合并分类变量统计表格的指定单元格?
解决Reactable表格重复单元格合并问题
问题分析
你的代码目前存在两个核心问题:
- 丢失了变量名列,无法区分不同分类变量的统计结果
- 同一变量的
Valid Count和Missing Count在每一行重复显示,冗余且不美观
修改后的完整代码
library(dplyr) library(reactable) # 修正原代码中的包名笔误 # 修正统计函数,添加变量名参数 calculate_summary <- function(x, var_name) { data_summary <- data.frame(Category = x) %>% count(Category, name = "Frequency") %>% mutate( Variable = var_name, # 新增变量名列 Percent = round((Frequency / sum(Frequency)) * 100, 2), # 百分比保留两位小数 Valid_Count = sum(!is.na(Category)), Missing_Count = sum(is.na(Category)) ) %>% select(Variable, Category, Frequency, Percent, Valid_Count, Missing_Count) return(data_summary) } # 创建带单元格合并功能的reactable表格 create_reactable <- function(data) { # 遍历每个变量生成汇总,同时传递变量名 data_summary <- purrr::imap(data, ~calculate_summary(.x, .y)) combined_data <- do.call(rbind, data_summary) # 处理重复值:同一变量的有效数、缺失数仅保留第一行 combined_data <- combined_data %>% group_by(Variable) %>% mutate( Valid_Count = ifelse(row_number() == 1, Valid_Count, NA), Missing_Count = ifelse(row_number() == 1, Missing_Count, NA) ) %>% ungroup() reactable( combined_data, striped = TRUE, resizable = TRUE, wrap = FALSE, style = list(fontFamily = "Helvetica"), columns = list( Variable = colDef( name = "变量名", # 合并同一变量的单元格 cell = function(value, index, name) { if (index == 1 || combined_data$Variable[index] != combined_data$Variable[index - 1]) { rowspan <- sum(combined_data$Variable == value) htmltools::tags$td(value, rowspan = rowspan) } else { htmltools::tags$td(style = "display: none;") } } ), Category = colDef(name = "变量类别"), Frequency = colDef(name = "类别频数"), Percent = colDef(name = "百分比 %"), Valid_Count = colDef( name = "有效数", # 合并有效数单元格 cell = function(value, index, name) { if (!is.na(value)) { rowspan <- sum(combined_data$Variable == combined_data$Variable[index]) htmltools::tags$td(value, rowspan = rowspan) } else { htmltools::tags$td(style = "display: none;") } } ), Missing_Count = colDef( name = "缺失数", # 合并缺失数单元格 cell = function(value, index, name) { if (!is.na(value)) { rowspan <- sum(combined_data$Variable == combined_data$Variable[index]) htmltools::tags$td(value, rowspan = rowspan) } else { htmltools::tags$td(style = "display: none;") } } ) ), showPagination = TRUE ) } # 示例数据 set.seed(123) data <- data.frame( Variable = c("A", "B", "C", "D", "E", NA), Proba = c("A", "B", "C", "D", "E", NA) ) # 生成并展示表格 reactable_data <- create_reactable(data) reactable_data
关键修改说明
- 修正包依赖:原代码中的
reachable是笔误,正确包名为reactable - 新增变量名列:在统计函数中添加
Variable列,关联原数据的变量名称 - 去重预处理:通过分组和行号判断,将同一变量的有效数、缺失数仅保留第一行,其余设为NA
- 单元格合并实现:利用
colDef的cell参数,通过HTML的rowspan属性实现同一变量的单元格纵向合并,重复行的单元格直接隐藏
最终效果
修改后的表格会:
- 清晰区分每个分类变量,同一变量的名称单元格自动合并
- 有效数、缺失数仅在每个变量的第一行显示,避免重复冗余
- 保留所有统计列的完整信息,同时视觉结构更简洁
内容的提问来源于stack exchange,提问作者Denmla
相关产品推荐
相关产品推荐

