R语言使用svytable做加权统计时如何过滤指定类别样本?
解决方法
有两种常用的实现方式,优先推荐第一种,符合survey包的加权计算规范:
方法1:直接对加权设计对象做子集筛选
survey包支持直接对svydesign生成的设计对象使用subset()筛选样本,不会丢失权重、分层、整群等抽样设计信息,代码如下:
# 先筛选UN_sumaAC_R大于0的样本,生成子设计对象 sub_design <- subset(f_design, UN_sumaAC_R > 0) # 计算加权占比 round(100*prop.table(svytable(~UN_sumaAC_R, design = sub_design)),2)
按你之前给出的全量加权频数结果,运行后输出应为:
UN_sumaAC_R 1 10 100 97.42 0.74 1.84
方法2:手动处理全量加权表结果
如果不想额外生成子设计对象,也可以先算出全量加权频数后,剔除0对应的取值再计算占比:
# 先获取全量加权频数 full_tab <- svytable(~UN_sumaAC_R, design = f_design) # 剔除取值为0的行后计算占比 round(100*prop.table(full_tab[names(full_tab) != "0"]),2)
补充说明
如果你更习惯tidyverse的语法,可以安装加载srvyr包,它对survey包做了tidy语法适配,可以直接用filter()对设计对象做筛选,代码逻辑和你处理非加权数据时一致:
library(srvyr) f_design %>% filter(UN_sumaAC_R > 0) %>% survey_count(UN_sumaAC_R, wt = NULL, sort = FALSE) %>% mutate(percent = 100 * n / sum(n))
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

