[R] Using weighted.mean() in aggregate()

Spencer Graves spencer.graves at pdf.com
Sun Jun 22 03:02:01 CEST 2003


 > tstdf <- data.frame(Sub =rep(1:2, 2),
+  Length=1:4, Slope=11:14)
 > by(tstdf, tstdf$Sub,
+  function(x)weighted.mean(x$Slope, x$Length))
tstdf$Sub: 1
[1] 12.5
------------------------------------------------------------
tstdf$Sub: 2
[1] 13.33333
 >
Does this answer your question?

hth.  spencer graves

Aleksey Naumov wrote:
> Dear R users, I have a question on using weighted.mean() while aggregating a 
> data frame. I have a data frame with columns Sub, Length and Slope:
> 
> 
>>x[1:5,]
> 
>   Sub   Length        Slope
> 1   2  351.547 0.0025284969
> 2   2  343.738 0.0025859390
> 3   1  696.659 0.0015948968
> 4   2 5442.338 0.0026132544
> 5   1  209.483 0.0005304225
> 
> and I would like to calculate the weighted.mean of Slope, using Length as 
> weights, for each value of Sub. The obvious way:
> 
> 
>>aggregate(list(Mean.Slope=x$Slope), by=list(Sub=x$Sub), FUN=weighted.mean, 
> 
> w=x$Length)
> 
> does not work. weighted.mean() generates warnings that "longer object length 
> is not a multiple of shorter object length in: x * w", from which I conclude 
> that weights are not supplied as I intend, instead each subset of Sub, when 
> passed to weighted.mean(), receives the whole x$Length as weights, which is 
> not correct.
> 
> Is there an elegant way to do this, or do I have to have a loop here?
> 
> Thank you,
> Aleksey
>




More information about the R-help mailing list