# Re: [R] using weighted.mean with tapply()

From: Markus J�ntti <markus.jantti_at_iki.fi>
Date: Thu 04 Aug 2005 - 07:48:23 EST

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[], ...) : '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:

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)
```

>
>  1853
>
```>>length(mat\$mcap)
```

>
>  1853
>
```>>length(mat\$trt1m)
```

>
>  1853
>
```>>mean(mat\$trt1m)
```

>
>  -0.04475397
> weighted.mean(mat\$trt1m, w=mat\$mcap)
>  -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@stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
>
```--
Markus Jantti