适配期刊要求:如何将gtsummary表格空单元格替换为NA?
解决gtsummary表格中空单元格替换为NA的问题
问题背景
期刊要求表格所有空单元格标记为NA,尝试以下代码未达到预期效果:
library(gtsummary) glm(response ~ age + stage, trial, family = binomial) %>% tbl_regression( exponentiate = TRUE) %>% modify_table_body( ~.x %>% mutate( across(all_stat_cols(), ~gsub("^0.*", "NA", .)) ) )
使用everything()替代all_stat_cols()时出现报错:
Error in
map():
ℹ In index: 1.
Caused by error inmutate():
ℹ In argument:~gsub("^0.*", "NA", .).
Caused by error:
!~gsub("^0.*", "NA", .)must be a vector, not a object.
问题分析
- 原代码用
gsub("^0.*", "NA", .)尝试替换以0开头的内容,但空单元格在gtsummary的表格数据框中并非以"0..."形式存在,而是NA或空字符串,因此匹配不到目标内容。 - 使用
everything()会包含非字符类型的列(如整数、因子列),而gsub仅能处理字符向量,触发类型不匹配的错误。
可行解决方案
方案1:精准定位统计列并替换空/缺失值
筛选出字符类型的统计列,将空字符串和缺失值统一替换为"NA":
library(gtsummary) library(dplyr) glm(response ~ age + stage, trial, family = binomial) %>% tbl_regression(exponentiate = TRUE) %>% modify_table_body( ~ .x %>% mutate( across( where(~is.character(.x) & starts_with("stat_")), ~ ifelse(is.na(.) | . == "", "NA", .) ) ) )
方案2:使用gtsummary内置函数处理
利用gtsummary原生的modify_fmt_fun()函数,直接对统计列的缺失值进行格式化:
library(gtsummary) glm(response ~ age + stage, trial, family = binomial) %>% tbl_regression(exponentiate = TRUE) %>% modify_fmt_fun( all_stat_cols(), ~ ifelse(is.na(.), "NA", .x) )
说明
- 方案1灵活性更强,可同时处理空字符串和缺失值两种情况;
- 方案2贴合gtsummary的设计逻辑,代码更简洁,推荐优先使用。
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

