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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:40:00