R data.table按月份分组计算weighted.mean结果与普通均值一致问题
R data.table按月份分组计算年度等权均值问题解答
错误原因
你原来的代码没有给weighted.mean()传入自定义权重参数w,函数默认所有样本权重相等,因此计算结果和普通mean()完全一致,没有实现按年份等权的需求。
实现逻辑
你要求的「按月份分组时每年performance权重相等」,核心规则是:
- 同一月份下,每一个年份的总权重为1
- 若某一年该月份有n条数据,每条数据平分当年的权重,即单条权重为
1/n - 若某一年该月份仅有1条数据,单条权重直接为1
正确代码
场景1:每个(year, month)组合仅对应1条数据(你的示例属于该场景)
library(data.table) setDT(dat) # 按月份分组,每组内每条数据对应一个独立年份,权重均为1/分组样本数 res <- dat[, .(weighted_perf = weighted.mean(performance, w = rep(1/.N, .N), na.rm = TRUE)), by = month]
运行结果:
month weighted_perf 1: 2 0.3576029 2: 10 0.3032712
场景2:存在同一个(year, month)组合对应多条数据的通用场景
# 先计算每条数据的权重:同一年月下的n条数据平分权重1 res <- dat[, wt := 1/.N, by = .(year, month)][, .(weighted_perf = weighted.mean(performance, w = wt, na.rm = TRUE)), by = month]
结果说明
你感知的「10月正值更多应该均值更高」属于误判,实际计算你的示例数据:
- 2月共8个年份的数值总和为2.8608,除以8得到均值0.3576
- 10月共7个年份的数值总和为2.1229,除以7得到均值0.3033
因此结果符合数值实际分布,没有逻辑错误。
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

