[R] using weighted.mean with tapply()

Markus Jäntti markus.jantti at iki.fi
Wed Aug 3 23:48:23 CEST 2005


roger bos wrote:
> I am trying to calculate the weighted mean for a of 10 deciles and I
> get an error:
> 
>>decile <- tapply(X=mat$trt1m, INDEX=mat$Rank, FUN=weighted.mean, w=mat$mcap)
> 
> Error in FUN(X[[1]], ...) : 'x' and 'w' must have the same length
> 
> All three of my inputs have the same length, as shown below, and the
> weighted.mean calculation works by itself, just not in tapply()
> 

Hi -- I asked pretty much this same question some years ago:

http://www.r-project.org/nocvs/mail/r-help/1999/2160.html

The answer turns out to be that you should pass the index to tapply
rather than the data. In your case this would, I think, translate to

decile <- tapply(seq(along=mat$trlm, mat$Rank,
function(i, x=mat$trlm[i], w=mat$mcap[i])
weighted.mean(x[i], w[i]))

hope this helps.

regards,

Markus

> 
>>length(mat$Rank)
> 
> [1] 1853
> 
>>length(mat$mcap)
> 
> [1] 1853
> 
>>length(mat$trt1m)
> 
> [1] 1853
> 
>>mean(mat$trt1m)
> 
> [1] -0.04475397
> weighted.mean(mat$trt1m, w=mat$mcap)
> [1] -0.04819243
> 
>>mat$mcap[is.na(mat$mcap)] <- min(mat$mcap, na.rm=TRUE)
> 
> 
> I am probably making a simple error in how I pass the optional
> parameter w.  Any help would be greatly appreciated.
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
> 


-- 
Markus Jantti
Abo Akademi University
markus.jantti at iki.fi
http://www.iki.fi/~mjantti




More information about the R-help mailing list