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

如何在gtsummary中替换样本量<30的单元格?解决字符比较错误

解决gtsummary表格样本量替换的字符比较错误问题

问题现象

在使用gtsummary生成分组统计表格时,尝试用modify_table_body将样本量小于30的统计值替换为"~",发现仅对个位数/两位数的小样本量有效;当样本量为三位数(如200+)时,会被误判为小于30,导致错误替换。示例代码中ex1结果错误,而ex2(判断阈值为20)暂时正常,因为两位数的字符比较未触发字典序问题。

问题原因

gtsummary生成的stat_1、stat_2等统计列是字符类型,而非数值型。直接对字符做大小比较时,R会按字典序(字符串ASCII码顺序)判断:比如"210"和"30"比较,第一个字符"2"的ASCII码小于"3",因此会判定"210"<"30"为TRUE,导致误替换。

解决方案

方案1:转换为数值型后再判断

在ifelse条件中,先用as.numeric()将stat_2转换为数值型,再与阈值比较,规避字符字典序的干扰:

set.seed(2023)
trt <- sample(c("Drug A", "Drug B"), 1340, replace = T)
grade <- sample(c("I", "II", "III"), 1340, replace = T)
dat <- as.data.frame(cbind(trt, grade))

# 修正后的代码
ex1_fixed <- dat %>%
  select(grade, trt) %>%
  tbl_summary(by = trt,
              statistic = ~"{n}",
              percent = "row") %>% 
  modify_table_body(~ .x %>% 
                      dplyr::mutate(stat_1 = ifelse(as.numeric(stat_2) < 30, "~", stat_1)))  

方案2:使用gtsummary内置的modify_fmt_fun

更贴合gtsummary工作流的方式是用modify_fmt_fun,直接对统计值格式进行控制,同时传递参考列做判断:

ex1_fmt_fun <- dat %>%
  select(grade, trt) %>%
  tbl_summary(by = trt,
              statistic = ~"{n}",
              percent = "row") %>%
  modify_fmt_fun(
    columns = stat_1,
    fn = function(x, ref_stat) {
      ifelse(as.numeric(ref_stat) < 30, "~", x)
    },
    ref_stat = stat_2 # 传递stat_2列作为参考样本量
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:33:13