Try this

sapply(split(df, df$g), function(x) apply(x[, 1:2], 2, weighted.mean, 
x$w))

Jean


StellathePug wrote on 09/21/2011 01:15:33 PM:
> 
> Dear R Users,
> I have looked for a solution to the following problem and I have not 
been
> able to find it on the archive, through Google or in the R 
documentation.
> 
> I have a data frame, say df, which has 4 variables, one of which I would
> like to use as a grouping variable (g), another one that I would like to 
use
> for my weights (w) The other two variables are variables (x1 and x2) for
> which I would like to compute the weighted average by group.
> 
> df <- data.frame(x1 = c(15, 12,  3, 10, 10, 14, 12), 
>                        x2 = c(10, 11, 16,  9,   7, 17, 18),
>                         g = c(  1,   1,  1,  2,   2,   3,  3), 
>                         w = c( 2,   3,  1,  5,   5,   2,  5)) 
> 
> wx1 <- sapply(split(df, df$g), function(x){weighted.mean(x$x1, x$w)}) 
> wx2 <- sapply(split(df, df$g), function(x){weighted.mean(x$x2, x$w)})
> 
> The above code works, the result is:
> > wx1
>        1        2        3 
> 11.50000 10.00000 12.57143 
> > wx2
>        1        2        3 
> 11.50000  8.00000 17.71429
> 
> But is there not a more elegant way of acting on x1 and x2 
simultaneously?
> Something along the lines of
> 
> wdf <- sapply(split(df, df$g), function(x){weighted.mean(df, x$w)})
> 
> which is wrong since df has two columns, while w only has one. I 
suppose,
> one could write a loop but that strikes me as being highly inefficient.
> 
> Thank you very much for your help!
> Rita
> 

	[[alternative HTML version deleted]]

