R语言按id_municipio分组计算v0220两类取值的加权均值
R按市镇分组计算v0220分类加权均值并输出宽表
实现逻辑
按id_municipio(市镇编码)、v0220(1/2分类变量)分组,以peso_amostral(抽样权重)结合n(观测出现次数)作为复合权重计算加权均值,最终将长格式结果转为要求的宽表结构,列顺序保持id_municipio、v0220=2对应值、v0220=1对应值。
Tidyverse 方案(代码简洁易读,推荐)
# 加载依赖包 library(dplyr) library(tidyr) # 替换df为你的实际数据集名称 calc_result <- df %>% group_by(id_municipio, v0220) %>% # 加权均值 = 加权求和 / 权重总和,复合权重为抽样权重*观测出现次数 summarise( w_mean = sum(v0220 * peso_amostral * n) / sum(peso_amostral * n), .groups = "drop" ) %>% # 长表转宽表 pivot_wider( names_from = v0220, values_from = w_mean ) %>% # 调整列顺序匹配输出要求 select(id_municipio, `2`, `1`)
基础R方案(无需安装第三方包)
# 分组计算加权和、权重总和 agg_df <- aggregate( x = list( w_val = df$v0220 * df$peso_amostral * df$n, w_total = df$peso_amostral * df$n ), by = list(id_municipio = df$id_municipio, v0220 = df$v0220), FUN = sum ) # 计算加权均值 agg_df$w_mean <- agg_df$w_val / agg_df$w_total # 转换为宽表 calc_result <- reshape( data = agg_df[, c("id_municipio", "v0220", "w_mean")], idvar = "id_municipio", timevar = "v0220", direction = "wide" ) # 修正列名、调整列顺序 colnames(calc_result) <- c("id_municipio", "2", "1") calc_result <- calc_result[, c("id_municipio", "2", "1")]
说明:如果需要计算加权均值的目标变量不是
v0220本身,只需要把上述代码中参与加权求和的v0220替换为实际目标变量的字段名即可。
内容的提问来源于stack exchange,提问作者Mateus Maciel
相关产品推荐
相关产品推荐

