如何在临床试验报告的rtables表1中为分类变量添加百分比
解决rtables生成基线表时分类变量显示计数+百分比的问题
需求与问题
在临床试验论文的「表1(基线受试者特征)」中,需为分类变量的每个水平添加百分比,rtables包生成的其他内容符合预期,但默认仅显示计数。原示例代码中分类变量(SEX、COLOR、SOUND)仅展示计数,期望呈现「计数(百分比)」格式(如16 (47.1%)),尝试多种方法均存在问题:
- 合并变量分析导致所有水平折叠,仅显示总计数及100%;
- 按多变量拆分行时出现递归索引错误;
- 单独拆分每个变量并分析,虽得到百分比,但变量层级混乱,所有水平混排且带有函数标签Cat_Summary。
解决方案
核心是修改分析函数中因子变量的处理逻辑,计算每个水平的计数与对应列的百分比,同时保留正确的表格层级。以下是完整修改后的代码:
require(rtables) set.seed(6502) SubjChar <- data.frame( USUBJID = c(101:200), TREATMENT = as.factor(sample(c("Placebo", "Drug A", "Drug B"), 100, replace = TRUE)), AGE = c(rnorm(100) * 5 + 30), HEIGHT = c(rnorm(100) * 20 + 180), WEIGHT = c(rnorm(100) * 15 + 80), SEX = as.factor(sample(c("Male", "Female"), 100, replace = TRUE)), COLOR = as.factor(sample(c("Blue", "Green", "Pink", "Violet"), 100, replace = TRUE)), SOUND = as.factor(sample(c("Woof", "Meow", "Mooooooooo", "Quack"), 100, replace = TRUE)) ) flexible_summary <- function(x) { if (is.numeric(x)) { in_rows( "Mean (sd)" = rcell(c(mean(x, na.rm = TRUE), sd(x, na.rm = TRUE)), format = "xx.xx (xx.xx)"), "min - max" = rcell(range(x, na.rm = TRUE), format = "xx.xx - xx.xx") ) } else if (is.factor(x)) { # 获取当前列的有效样本总数(排除NA) total <- sum(!is.na(x)) # 统计每个因子水平的计数 level_counts <- table(x, useNA = "no") # 构建每个水平的行元素 row_elements <- lapply(names(level_counts), function(level) { count <- as.integer(level_counts[level]) pct <- (count / total) * 100 # 用自定义格式显示计数和百分比 rcell(c(count, pct), format = "xx (xx.x%)") }) # 为行元素命名为对应因子水平,保证层级正确 names(row_elements) <- names(level_counts) do.call(in_rows, row_elements) } else { stop("type not supported") } } # 构建表格布局 lyt1 <- basic_table(show_colcounts = TRUE) %>% split_cols_by("TREATMENT") %>% analyze(vars = c("AGE", "HEIGHT", "WEIGHT", "SEX", "COLOR", "SOUND"), flexible_summary) # 生成最终表格 (Table1 <- build_table(lyt1, SubjChar))
关键修改说明
- 计算列样本总数:通过
sum(!is.na(x))获取当前分组列的有效样本量,作为百分比计算的分母; - 自定义显示格式:使用
rcell传入计数和百分比组成的向量,通过format = "xx (xx.x%)"控制输出样式,保证格式统一; - 保持层级结构:将每个行元素命名为对应因子水平,避免出现混乱的函数标签,确保表格层级符合基线表的规范。
内容的提问来源于stack exchange,提问作者KJG
相关产品推荐
相关产品推荐

