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

为变量设置标签导致{gtsummary}统计表格百分比显示NA的求助

解决{gtsummary}设置分类变量水平后百分比显示NA的问题

问题出在你修改因子水平的方式上——直接用levels()修改已存在的因子,会导致survey设计对象无法正确识别因子的属性,进而让tbl_svysummary计算列百分比时返回NA。

两种可行的解决办法:

方法一:创建因子时直接指定标签

在把数值变量转换成因子的同时,就指定好水平对应的标签,替代事后修改levels的操作:

library(survey)
library(gtsummary)
library(cobalt)

# 创建数据并添加含5个水平的分类变量hello:
data <- lalonde
hello <- sample(1:5, nrow(data), replace = TRUE)
# 创建因子时直接指定水平和标签
data$hello <- factor(hello, levels = 1:5, labels = c("hello_1", "hello_2", "hello_3", "hello_4", "hello_5"))

# 指定要纳入表格的变量:
vars <- c("hello")

# 创建表格1:
datasvy <- survey::svydesign(~1, data = data, strata = ~treat)

table1 <- tbl_svysummary(
  datasvy,
  by = treat,
  include = all_of(vars),
  statistic = list(
    all_categorical() ~ "{n}({p}%)"
  ),
  percent = "col",
  digits = list(
    all_categorical() ~ c(0, 1)
  )
)
table1 <- as.data.frame(table1)

方法二:用forcats包修改因子水平

如果已经创建了因子,推荐用forcats::fct_recode()来修改水平名称,它会正确更新因子的元数据:

library(survey)
library(gtsummary)
library(cobalt)
library(forcats)

# 创建数据并添加含5个水平的分类变量hello:
data <- lalonde
hello <- sample(1:5, nrow(data), replace = TRUE)
data$hello <- as.factor(hello)

# 用fct_recode修改水平标签
data$hello <- fct_recode(data$hello,
  "hello_1" = "1",
  "hello_2" = "2",
  "hello_3" = "3",
  "hello_4" = "4",
  "hello_5" = "5"
)

# 后续代码不变...

两种方法都能让tbl_svysummary正常计算分组列百分比,不会出现NA。

内容的提问来源于stack exchange,提问作者geek45

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:52:38