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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:18:19