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

在R中计算按周分组的多列加权平均值的简便方法

按周计算多列加权平均值的简便方法

方法一:dplyr + 矩阵运算(无需额外列)

先把权重整理成匹配列名的向量,直接在分组后通过矩阵乘法计算每行加权值,再求组内均值:

library(dplyr)

# 提取权重并匹配列名
weights_vec <- weightsreprex$weights
names(weights_vec) <- weightsreprex$county

# 按周分组计算
dfreprex %>%
  group_by(week) %>%
  summarise(weighted_avg = mean(as.matrix(select(., col_a:col_c)) %*% weights_vec))

这里as.matrix(select(., col_a:col_c)) %*% weights_vec会直接算出每行的加权和(因权重总和为1,也就是该行的加权平均值),再用mean()求该周所有行的均值。

方法二:转长格式计算(逻辑更直观)

把宽表转成键值对格式,关联权重后直接按周计算:

library(dplyr)
library(tidyr)

dfreprex %>%
  # 将列转为键值对
  pivot_longer(cols = starts_with("col_"), names_to = "county", values_to = "value") %>%
  # 关联权重数据
  left_join(weightsreprex, by = "county") %>%
  # 按周分组计算加权均值
  group_by(week) %>%
  summarise(weighted_avg = sum(value * weights) / n())

补充:先求列组均值再加权

如果你的需求是先按周计算各列的均值,再用权重加权得到每周整体值,可这么写:

dfreprex %>%
  group_by(week) %>%
  summarise(across(col_a:col_c, mean)) %>%
  mutate(weighted_avg = col_a*0.3721 + col_b*0.3794 + col_c*0.2485)

以上方法都无需单独创建加权列,直接在流程内完成计算,比分步建列更高效。

内容的提问来源于stack exchange,提问作者James Montavon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:35:24