按功能加权均值

时间:2014-12-22 19:22:41

标签: r

尝试获得想要使用的几个类别的加权平均值(df $ A,df $ B,function(x)weighted.mean(x,df $ C))这当然不起作用。有没有办法使用by()和weighted.mean()

来做到这一点
 df= data.frame(A=c(1,4,56,4,3),B=c('hi','gb','hi','gb','yo'),C=c(5,2,4,1,3))

 by(df$A,df$B,function(x) weighted.mean(x,df$C)) #doesn't work

我有一堆工作,但如果我可以使用那种格式就会很简单。

3 个答案:

答案 0 :(得分:4)

这是使用data.table

的简单而有效的解决方案
library(data.table)
setDT(df)[, .(WM = weighted.mean(A, C)), B]
#     B       WM
# 1: hi 25.44444
# 2: gb  4.00000
# 3: yo  3.00000

或使用基础R的splitapply组合

sapply(split(df, df$B), function(x) weighted.mean(x$A, x$C))
#      gb       hi       yo 
# 4.00000 25.44444  3.00000 

或者

library(dplyr)
df %>%
  group_by(B) %>%
  summarise(WM = weighted.mean(A, C))
# Source: local data frame [3 x 2]
# 
# B       WM
# 1 gb  4.00000
# 2 hi 25.44444
# 3 yo  3.00000

答案 1 :(得分:3)

您需要传递权重以及要在by()中平均的值:

by(df[c("A","C")], df$B, function(x) weighted.mean(x$A, x$C))
# df$B: gb
# [1] 4
# ------------------------------------------------------------ 
# df$B: hi
# [1] 25.44444
# ------------------------------------------------------------ 
# df$B: yo
# [1] 3

答案 2 :(得分:2)

或者只是重新创建weighted.mean()使用的计算:

by(df,df$B,function(df)with(df,sum(A*C)/sum(C)))

df$B: gb
[1] 4
------------------------------------------------------------ 
df$B: hi
[1] 25.44444
------------------------------------------------------------ 
df$B: yo
[1] 3