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

如何在R中基于单个因子对双变量执行加权均值计算

解决R语言分组加权均值计算问题

嘿,刚学R遇到这种分组计算的需求完全不用慌!我来给你演示两种简单易懂的方法,正好对应你要的按a分组、以b为权重计算c的加权均值需求。

首先,先把你给的示例数据转换成R里可以直接用的数据框,方便后续操作:

df <- data.frame(
  a = c(1, 1, 2, 2),
  b = c(1, 3, 2, 1),
  c = c(2, 5, 4, 5)
)

方法一:用dplyr包(新手友好,语法直观)

dplyr是tidyverse家族里的工具,专门处理数据分组和汇总,语法非常好懂。

首先安装并加载包(如果还没装过的话):

install.packages("dplyr")  # 仅第一次需要安装
library(dplyr)

然后直接用分组+汇总的操作得到结果:

result <- df %>%
  group_by(a) %>%
  summarize(weighted_mean_c = sum(b * c) / sum(b))

print(result)

运行后你会看到:

# A tibble: 2 × 2
      a weighted_mean_c
  <dbl>           <dbl>
1     1            17/7
2     2            13/9

完全符合你想要的结果!这里的逻辑很简单:

  • group_by(a):按a列的值把数据分成不同的组
  • summarize(...):对每个组计算你要的加权均值,公式就是(b1*c1 + b2*c2)/(b1+b2),也就是sum(b*c)/sum(b)

方法二:用基础R(不用额外安装包)

如果你暂时不想装新包,用基础R的aggregate函数也能搞定:

result_base <- aggregate(
  cbind(b, c) ~ a, 
  data = df, 
  FUN = function(x) sum(x[,1] * x[,2]) / sum(x[,1])
)

colnames(result_base)[2] <- "weighted_mean_c"  # 给结果列改个直观的名字
print(result_base)

运行后得到的结果和dplyr方法完全一致。

关于权重是b/Σ(b)的补充

你提到也可能用b/Σ(b)作为权重,其实这个和用b做权重的结果是完全一样的!因为:
Σ( (b/Σb) * c ) = Σ(b*c)/Σb,和我们之前用的公式完全等价,所以上面的代码不需要做任何修改就能得到这个权重下的均值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:38:45