在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
相关产品推荐
相关产品推荐

