如何在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)
需求:
- 更优雅的方法在总计数行下方添加分段分隔符
- 更好的方式设置“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
相关产品推荐
相关产品推荐

