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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:58:16