R加权算术平均值

Rod*_*igo 2 aggregate r weighted-average

假设我在R中有这个data.frame:

ages <- data.frame(Indiv = numeric(),
    Age = numeric(),
    W = numeric())
ages[1,] <- c(1,10,2)
ages[2,] <- c(1,15,5)
ages[3,] <- c(2,5,1)
ages[4,] <- c(2,100,2)

ages

  Indiv Age W
1     1  10 2
2     1  15 5
3     2   5 1
4     2 100 2
Run Code Online (Sandbox Code Playgroud)

如果我做:

meanAge <- aggregate(ages$Age,list(ages$Indiv),mean)
Run Code Online (Sandbox Code Playgroud)

我得到每个Indiv(Group.1)的平均年龄(x):

  Group.1    x
1       1 12.5
2       2 52.5
Run Code Online (Sandbox Code Playgroud)

但我想计算年龄的加权算术平均值(权重为W).如果我做:

WmeanAge <- aggregate(ages$Age,list(ages$Indiv),weighted.mean,ages$W)
Run Code Online (Sandbox Code Playgroud)

我明白了:

Error in weighted.mean.default(X[[1L]], ...) : 
  'x' and 'w' must have the same length
Run Code Online (Sandbox Code Playgroud)

我想我应该:

  Group.1           x
1       1 13.57142857
2       2 68.33333333
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?提前致谢!

jar*_*emi 11

Doh,你打败了我.但无论如何,这里是同时使用我的答案plyrdplyr:

ages = data.frame(Indiv = c(1,1,2,2),
              Age = c(10,15,5,100),
              W = c(2,5,1,2))

library(plyr)
ddply(ages, .(Indiv), summarize, 
      mean = mean(Age),
      wmean = weighted.mean(Age, w=W))


library(dplyr)
ages %.% 
  group_by(Indiv) %.% 
  summarise(mean = mean(Age), wmean = weighted.mean(Age, W))
Run Code Online (Sandbox Code Playgroud)