簡體   English   中英

R中基於幾行的加權平均值

[英]Weighted average in R based on a few rows

我有一個像...的數據框

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

先天未知有助於一天加權平均值的行數,並且可以動態變化。 我希望有幾個值的加權平均值,但是當然,如​​果我有一個工作示例,則應該很容易歸納

謝謝!

你可以做:

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]

您可以使用ave Base R

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

有很多方法可以做到這一點,例如

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

您可以使用by函數

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

這將返回一個列表( simplify=FALSE ),其中日期作為名稱,加權平均值作為值。

然后,如果要為數據幀使用命名向量或data.frame(dates=names(var), means=unlist(var)) ,則可以使用unlist

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM