如何在table1包中为分类变量始终显示缺失值统计行(含缺失数为0)
解决table1包强制显示分类变量缺失值行的问题
核心思路
table1包默认仅在变量存在缺失值时显示缺失行,要实现所有分类变量强制显示缺失值统计,需自定义分类变量渲染函数,手动添加缺失值行,同时关闭默认的缺失值列逻辑,避免重复。
具体代码实现
1. 自定义分类变量渲染函数
编写一个强制包含缺失值行的渲染函数,无论缺失数是否为0:
# 自定义分类变量渲染函数,强制显示缺失值行 render_categorical_force_missing <- function(x, ...) { # 强制统计包含缺失值的类别 tab <- table(x, useNA = "always") tab_df <- as.data.frame(tab) # 计算百分比(基于总样本数,可按需改为非缺失样本) tab_df$pct <- round(tab_df$Freq / length(x) * 100, 1) # 生成"频数(百分比%)"格式的文本 tab_text <- paste0(tab_df$Freq, " (", tab_df$pct, "%)") # 将默认的"<NA>"标签替换为"Missing" names(tab_text)[is.na(names(tab_text))] <- "Missing" return(tab_text) }
2. 调用table1生成表格
在调用table1()时,指定自定义渲染函数,并关闭默认缺失值列以避免重复:
library(table1) # 构造示例数据(包含无缺失/有缺失的分类变量、连续变量) df <- data.frame( gender = factor(c("Male", "Female", "Male", "Female")), # 无缺失 disease = factor(c("Yes", "No", "Yes", NA)), # 有缺失 age = c(25, 30, 35, 40) ) # 生成统计表格 table1(~ gender + disease + age, data = df, # 应用自定义分类变量渲染函数 render.categorical = render_categorical_force_missing, # 保留你已实现的连续变量渲染逻辑 render.continuous = function(x) { c( "Mean (SD)" = sprintf("%.1f (%.1f)", mean(x, na.rm=T), sd(x, na.rm=T)), "Median [Min, Max]" = sprintf("%.1f [%.1f, %.1f]", median(x, na.rm=T), min(x, na.rm=T), max(x, na.rm=T)), "Missing" = sprintf("%d (%.1f%%)", sum(is.na(x)), sum(is.na(x))/length(x)*100) ) }, # 关闭默认缺失值列,避免重复显示 missing = FALSE)
关键说明
useNA = "always":强制table()函数统计缺失值类别,无论实际是否存在缺失missing = FALSE:关闭table1默认的缺失值列,因为自定义函数已手动添加缺失值行,防止重复- 百分比计算逻辑可调整:若需基于非缺失样本计算,将
length(x)替换为sum(!is.na(x))即可
内容的提问来源于stack exchange,提问作者degeso
相关产品推荐
相关产品推荐

