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

如何在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

关键修改说明

  1. 修正包依赖:原代码中的reachable是笔误,正确包名为reactable
  2. 新增变量名列:在统计函数中添加Variable列,关联原数据的变量名称
  3. 去重预处理:通过分组和行号判断,将同一变量的有效数、缺失数仅保留第一行,其余设为NA
  4. 单元格合并实现:利用colDef的cell参数,通过HTML的rowspan属性实现同一变量的单元格纵向合并,重复行的单元格直接隐藏

最终效果

修改后的表格会:

  • 清晰区分每个分类变量,同一变量的名称单元格自动合并
  • 有效数、缺失数仅在每个变量的第一行显示,避免重复冗余
  • 保留所有统计列的完整信息,同时视觉结构更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:06:16