如何在tbl_summary表格中替换Controls/Yes的0(0%)为NA并移除对应Overall列
解决方案:调整tbl_summary表格的两个需求
问题背景
在科研项目中使用tbl_summary制作人口学表格时,antibodies变量仅适用于Cases组,Controls组的该变量值均为'No',需解决以下两个问题:
- 将表格中Controls组/Yes行的
0(0%)替换为NA(或空值) - 移除
antibodies部分的Overall列内容,但保留表格其他特征的Overall列
当前代码
tbl_summary( data, by = group, missing='no', type = all_dichotomous() ~ "categorical", statistic = list( all_categorical() ~ "{n} ({p}%)", all_continuous() ~ "{mean} ({sd})" ), include = c('age', 'sex', 'n_observations','antibodies'), ) %>% add_p(pvalue_fun = function(x) style_pvalue(x, digits = 2), include=-antibodies) %>% modify_header(p.value = ("**P Value**"))%>% add_overall() %>% modify_caption("**Table 1** (N = {N})")
当前生成的表格
| Characteristic | Overall | Cases(N=85) | Controls(N=85) | P Value |
|---|---|---|---|---|
| Sex | ||||
| Female | 77(45%) | 43(52%) | 34(40%) | 0.17 |
| Male | 93(55%) | 42(49%) | 52(60%) | |
| Antibodies Detected | ||||
| No | 140 (82%) | 55 (65%) | 85 (100%) | |
| Yes | 30 (18%) | 30 (35%) | 0 (0%) |
修改后的代码
通过modify_table_body和modify_cell实现需求,代码如下:
library(gtsummary) library(tidyverse) tbl_summary( data, by = group, missing='no', type = all_dichotomous() ~ "categorical", statistic = list( all_categorical() ~ "{n} ({p}%)", all_continuous() ~ "{mean} ({sd})" ), include = c('age', 'sex', 'n_observations','antibodies'), ) %>% add_p(pvalue_fun = function(x) style_pvalue(x, digits = 2), include=-antibodies) %>% modify_header(p.value = ("**P Value**")) %>% add_overall() %>% # 替换Controls/Yes的0(0%)为NA modify_table_body( ~ .x %>% mutate( stat_3 = ifelse(variable == "antibodies" & label == "Yes", ifelse(stat_3 == "0 (0%)", NA, stat_3), stat_3) ) ) %>% # 移除antibodies部分的Overall列内容 modify_table_body( ~ .x %>% mutate( stat_1 = ifelse(variable == "antibodies", NA, stat_1) ) ) %>% # 将NA显示为空字符串,优化表格视觉效果 modify_cell( update = list( stat_1 = ~ ifelse(is.na(.x), "", .x), stat_3 = ~ ifelse(is.na(.x), "", .x) ) ) %>% modify_caption("**Table 1** (N = {N})")
代码说明
- 替换Controls/Yes的0(0%):
在modify_table_body中,通过判断variable为antibodies且label为Yes的行,将Controls列(对应stat_3,add_overall后列顺序为Overall=stat_1、Cases=stat_2、Controls=stat_3)的0 (0%)替换为NA。 - 移除antibodies的Overall列:
同样在modify_table_body中,将variable为antibodies的所有行的Overall列(stat_1)值设为NA。 - 优化NA显示:
使用modify_cell将NA转换为空字符串,让表格更整洁。
内容的提问来源于stack exchange,提问作者Kelly
相关产品推荐
相关产品推荐

