R中筛选Survey对象后使用tbl_svysummary与add_difference报错的解决
解决方法
针对api模拟数据的修正
subset()处理调查设计对象后,不会自动丢弃因子的多余水平,必须手动清理才能满足add_difference()的要求:
library(survey) library(gtsummary) data(api) # 创建调查设计对象 svy <- survey::svydesign(id = ~dnum, weights = ~pw, data = apiclus1, fpc = ~fpc) # 筛选目标类别 svy <- subset(svy, stype %in% c("E", "H")) # 删除因子的多余水平 svy$variables$stype <- droplevels(svy$variables$stype) # 生成对比表并添加差异 svy %>% tbl_svysummary(by = stype) %>% add_difference()
针对PNSIBGE数据的修正
get_pns()返回的是调查设计对象,直接修改$variables子对象可能不生效,建议用survey::update()函数更新变量,确保因子水平被正确删除:
install.packages("PNSIBGE") library(PNSIBGE) library(tidyverse) library(gtsummary) # 获取数据 pns <- get_pns(year = 2019, labels = T) # 筛选目标类别 pns.2 <- subset(pns, C009 %in% c("Branca", "Preta")) # 使用update函数删除多余因子水平 pns.2 <- update(pns.2, C009 = droplevels(C009)) # 生成对比表并添加差异 pns.2 %>% tbl_svysummary(by = C009, include = c(C006)) %>% add_difference()
关键说明
- 调查设计对象(
svydesign)的变量不会因subset()自动丢弃因子水平,必须手动调用droplevels()处理目标分组变量 - 对于复杂调查对象,优先用
survey::update()修改变量,避免直接操作$variables带来的潜在问题 - 操作后可通过
levels(pns.2$variables$C009)检查分组变量的水平数,确认仅保留两个层级
内容的提问来源于stack exchange,提问作者r_rabbit
相关产品推荐
相关产品推荐

