具有聚合函数的加权平均值

时间:2014-12-23 21:48:36

标签: r

我希望得到V1加权V2并按V3V4加权,所以我尝试aggregate,它没有&#39}。因为weighted.mean只接受来自aggregate的一个参数,所以它与mean相同:

df <- data.frame(V1=seq(1, 1.5, 0.1),
                 V2=seq(6, 1, -1),
                 V3=c('A','A','A','B','B','B'),
                 V4=c('F','P','P','P','F','F'))
aggregate(cbind(V1, V2) ~ V3 + V4, data=df, weighted.mean)

  V3 V4   V1  V2
1  A  F 1.00 6.0
2  B  F 1.45 1.5
3  A  P 1.15 4.5
4  B  P 1.30 3.0

所以我必须回到splitlapply并处理许多其他事情

df1 <- expand.grid(unique(df$V3), unique(df$V4))
colnames(df1) <- c('V3','V4')
df1$CrossTerm <- interaction(df1$V3, df1$V4)

temp <- sapply(split(df, interaction(df$V3, df$V4)), function(df) weighted.mean(df$V1, df$V2))
df2 <- data.frame(WeightedAvg=temp)
df2$CrossTerm <- rownames(df2)
df3 <- merge(df1, df2, by="CrossTerm")
df3$CrossTerm <- NULL
df3

  V3 V4 WeightedAvg
1  A  F    1.000000
2  A  P    1.144444
3  B  F    1.433333
4  B  P    1.300000

但它是一个丑陋且可能有问题的解决方案,是否有更好的解决方案来获得类似的结果?格式很重要,应该尽可能与我的输出类似(行的顺序可以不同)。

1 个答案:

答案 0 :(得分:2)

您可以使用data.table聚合轻松完成此操作:

library(data.table)
setDT(df)
##
R> df[
    ,list(
      wtdMean=weighted.mean(V1,V2)
    ),
    keyby="V3,V4"]
   V3 V4 wtdNMean
1:  A  F 1.000000
2:  A  P 1.144444
3:  B  F 1.433333
4:  B  P 1.300000