计算加权分组百分比时如何剔除缺失值
解决加权百分比计算中排除NA值的问题
要让NA值完全不纳入加权百分比的分析,只需在数据整理阶段过滤掉带有NA的观测,确保后续分组和计算仅针对有效数据。以下是修改后的完整代码:
library(srvyr) library(tidyverse) df <- data.frame( wave = rep(c(1,2),6), gender = rep(c("m", "f", NA),4), exp = rep(c("c", "e", NA),4), weights = rnorm(12, 1, .5) ) df %>% gather(key, value, gender, exp) %>% filter(!is.na(value)) %>% # 剔除所有value为NA的观测,完全排除缺失值 as_survey_design(1, weight = weights) %>% group_by(wave, key, value) %>% summarise( prop_weighted = survey_mean(na.rm = TRUE)*100, prop_weighted_se = attr(survey_mean(na.rm = TRUE), "var") %>% sqrt()*100 )
关键修改说明
- 新增
filter(!is.na(value)):这一步直接移除了所有带有NA的行,避免后续分组时出现NA类别,同时让加权百分比的计算分母变为对应wave和key下非NA观测的加权总和,确保百分比仅针对有效类别计算。 - 原代码中的
survey_mean(na.rm = TRUE)主要处理计算过程中的NA,但如果不提前过滤,分组会保留NA组,且百分比是基于所有观测(包括NA)的占比,不符合需求。
运行结果示例
修改后的输出会去掉所有NA相关的行,每个分组下的非NA类别加权百分比总和为100%:
# A tibble: 8 × 4 # Groups: wave, key [4] wave key value prop_weighted prop_weighted_se <dbl> <chr> <chr> <dbl> <dbl> 1 1 exp c 41.2 22.1 2 1 exp e 58.8 22.1 3 1 gender f 58.8 22.1 4 1 gender m 41.2 22.1 5 2 exp c 57.5 22.5 6 2 exp e 42.5 22.5 7 2 gender f 42.5 22.5 8 2 gender m 57.5 22.5
内容的提问来源于stack exchange,提问作者EML
相关产品推荐
相关产品推荐

