基于几行的R中的加权平均值

时间:2015-10-06 06:48:45

标签: r

我有一个像...这样的数据框。

date, name, area, value
01/01/15, brian, 20, 3
01/01/15, james, 30, 6
02/01/15, brian, 30, 4
02/01/15, james, 30, 5

我想逐日计算加权平均值。

在这个简化的示例中,我希望(20*3+30*6)/(20+30) = 01/01/15 weighted average(30*4+30*5)/(30+30) = 02/01/15 weighted average等。

贡献一天加权平均值的行数不是先验已知的,可以是动态的。有几个值我想要加权平均值,但当然如果我有一个单一的工作示例,它应该很容易概括

谢谢!

3 个答案:

答案 0 :(得分:2)

你可以这样做:

library(data.table)

setDT(df)[,.(waverage=sum(area*value)/sum(area)), date]

#       date waverage
#1: 01/01/15      4.8
#2: 02/01/15      4.5

或使用weighted.mean

setDT(df)[,.(waverage=weighted.mean(value,area)), date]

基础R您可以使用ave

with(df, ave(value*area, date, FUN=sum)/ave(area, date, FUN=sum))

答案 1 :(得分:0)

有很多方法可以做到这一点,例如

stack(lapply(split(df[, 3:4], df$date), function(df) with(df, weighted.mean(x = value, w = area))))
# values      ind
# 1    4.8 01/01/15
# 2    4.5 02/01/15

答案 2 :(得分:0)

您可以使用by功能

by(df, df$date, function(grp) weighted.mean(grp$value, grp$area), simplify=FALSE)

这会返回一个列表(simplify=FALSE),其中日期为名称,加权值为值。

如果您想要一个命名向量,或者unlist用于数据帧,则可以使用data.frame(dates=names(var), means=unlist(var))