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

如何在rtables中为总计数行添加优雅的分段分隔符?

问题描述

需要构建满足以下要求的rtables表格:

  • 顶部显示总计数
  • 按组和子组统计行数
  • 组/子组缩进层级减1
  • 组间使用分段分隔符(空行)
  • 总计数行后添加分段分隔符,与表格其余部分视觉区分

示例数据:

iris2 <- iris
iris2$group <- rep(letters[1:3], 50)

期望生成的表格样式:

all obs   
—————————————————————————
Overall      150 (100.0%)
                         
setosa        50 (33.3%) 
  a           17 (11.3%) 
  b           17 (11.3%) 
  c           16 (10.7%) 

versicolor    50 (33.3%) 
  a           17 (11.3%) 
  b           16 (10.7%) 
  c           17 (11.3%) 

virginica     50 (33.3%) 
  a           16 (10.7%) 
  b           17 (11.3%) 
  c           17 (11.3%)

当前实现方式繁琐,代码可读性差,且使用trim_rows()时,总计数行下的强制空行会被移除,其他分段分隔符不受影响:

library(rtables)

cfn <- function(df, labelstr, .N_col) {
  n <- nrow(df)
  in_rows(
    .names = c("Overall", " "),
    .list = list(rcell(c(n, n / .N_col)), " "),
    .formats = c("xx (xx.x%)", "xx")
  )
}

basic_table() |>
  summarize_row_groups(cfun = cfn) |>
  split_rows_by("Species", section_div = "", indent_mod = -1) |>
  summarize_row_groups() |>
  split_rows_by("group") |>
  summarize_row_groups() |>
  build_table(iris2)

需求:

  1. 更优雅的方法在总计数行下方添加分段分隔符
  2. 更好的方式设置“Overall”标签,而非通过制表函数

解决方案

1. 优雅实现总计数行及下方分隔符,避免trim_rows()移除空行

可以利用rtables的add_summary_row()和add_separator_row()函数,将总计数逻辑与表格主体分离,既提升可读性,又能避免空行被误删:

library(rtables)

# 准备数据
iris2 <- iris
iris2$group <- rep(letters[1:3], 50)

# 先构建表格主体结构(不含总计数)
base_table <- basic_table() |>
  split_rows_by("Species", section_div = "", indent_mod = -1) |>
  summarize_row_groups() |>
  split_rows_by("group") |>
  summarize_row_groups()

# 插入总计数行和下方分隔符
final_table <- base_table |>
  # 在顶部添加总计数行
  add_summary_row(
    label = "Overall",
    cfun = function(df, .N_col) {
      n <- nrow(df)
      rcell(c(n, n / .N_col), format = "xx (xx.x%)")
    },
    position = "top"
  ) |>
  # 在总计数行下方添加空行分隔符
  add_separator_row(
    above = "Overall",
    label = " ",
    format = "xx"
  ) |>
  build_table(iris2)

# 测试trim_rows(),空行不会被移除
trim_rows(final_table)

这种方式将总计数逻辑独立出来,代码结构更清晰,且add_separator_row()添加的空行不会被trim_rows()过滤。

2. 优化“Overall”标签的设置

通过add_summary_row()的label参数直接指定“Overall”,无需在自定义统计函数中设置.names,逻辑更直观。如果需要调整总计数行的缩进层级,只需在add_summary_row()中添加indent_mod = -1参数,与组行保持一致:

add_summary_row(
  label = "Overall",
  cfun = function(df, .N_col) {
    n <- nrow(df)
    rcell(c(n, n / .N_col), format = "xx (xx.x%)")
  },
  position = "top",
  indent_mod = -1
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:53:15