如何在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
相关产品推荐
相关产品推荐

