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

使用不同数据集计算分母时rbind报错的解决方案求助

解决rtables中不同分母表格合并报错的问题

问题背景

需要创建一个包含两部分的表格,两部分统计量使用不同分母,因此分开构建tbl_recipe1和tbl_recipe2。但由于两个表格的列头计数(N_col)不一致,使用rbind合并时出现报错。

解决方案核心

rtables的rbind要求合并的表格列结构完全一致,包括列头的计数信息。因此需要让两个表格的列头计数保持统一,同时通过count_occurrences的id参数控制统计量的分母,实现不同部分用不同分母统计的需求。

修改后的完整代码

library(random.cdisc.data)
library(dplyr)
library(rtables)
library(haven)
library(purrr)
library(stringr)
library(tern)
library(forcats)
library(formatters)

adsl_cdisc1 <- random.cdisc.data::cadsl
adex_cdisc1 <- random.cdisc.data::cadex

adsl_cdisc2 <- dplyr::filter(adsl_cdisc1, SAFFL == "Y") |>
  dplyr::select(USUBJID, TRT01A) |>
  dplyr::mutate(
    TRT01A = forcats::fct_inorder(TRT01A)
  )

adex_cdisc2 <- dplyr::select(
  adex_cdisc1, USUBJID, SAFFL, STRATA1, AVISIT) |>
  dplyr::left_join(adsl_cdisc2, by = "USUBJID") |>
  dplyr::mutate(
    EXP = dplyr::case_when(
      !is.na(AVISIT) ~ "Number of exposed participants",
      TRUE ~ NA_character_
    ),
    STRA = dplyr::case_when(
      STRATA1 == "B" ~ "Number of records with STRATA1 = B by visit",
      TRUE ~ NA_character_
    ),
    SORT = paste(USUBJID, AVISIT)
  ) |>
  dplyr::filter(SAFFL == "Y", !is.na(AVISIT))

adex_cdisc3 <- dplyr::filter(adex_cdisc1, SAFFL == "Y") |>
  dplyr::select(USUBJID, AVISIT) |>
  dplyr::right_join(adsl_cdisc2, by = "USUBJID") |>
  dplyr::mutate(
    SORT = paste(USUBJID, AVISIT)
  ) |>
  distinct(SORT, TRT01A)

# 第一部分表格:分母为受试者数(USUBJID)
tbl_recipe1 <- basic_table() |>
  add_colcounts() |>
  split_cols_by("TRT01A") |>
  count_occurrences("EXP",
                    id = "USUBJID",
                    .stats = "count_fraction"
                    ) |>
  rtables::build_table(adex_cdisc2, alt_counts_df = adsl_cdisc2)

# 第二部分表格:分母为记录数(SORT),但列头计数与第一部分统一为受试者数
tbl_recipe2 <- basic_table() |>
  add_colcounts() |>
  split_cols_by("TRT01A") |>
  count_occurrences("STRA",
                    id = "SORT",
                    .stats = "count_fraction"
                    ) |>
  rtables::build_table(adex_cdisc2, alt_counts_df = adsl_cdisc2)  # 改用adsl_cdisc2统一列头计数

# 合并表格
tbl <- rbind(
  tbl_recipe1,
  rtables::rrow(""),  # 添加空行分隔两部分
  tbl_recipe2
)

# 查看结果
tbl

关键说明

  1. 统一列头计数:两个表格的build_table都使用alt_counts_df = adsl_cdisc2,确保列头显示的总受试者数一致,让表格结构匹配。
  2. 控制统计分母:
    • tbl_recipe1的id = "USUBJID":统计时以受试者为单位,分母是每组的总受试者数。
    • tbl_recipe2的id = "SORT":统计时以记录(USUBJID+AVISIT组合)为单位,分母是每组的总记录数,实现不同分母的统计需求。
  3. 合并验证:修改后两个表格的列结构完全一致,rbind可以正常执行,生成包含两部分的完整表格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:49:52