Skip to content

tapply and weighted means

4 messages · Florent Bresson, Dimitris Rizopoulos, Frank E Harrell Jr +1 more

#
I' m trying to compute weighted mean on different
groups but it only returns NA. If I use the following
data.frame truc:

x  y  w
1  1  1
1  2  2
1  3  1
1  4  2
0  2  1
0  3  2
0  4  1
0  5  1

where x is a factor, and then use the command :

tapply(truc$y,list(truc$x),wtd.mean, weights=truc$w)

I just get NA. What's the problem ? What can I do ?
#
you need also to split the 'w' column, for each level of 'x'; you 
could use:

lapply(split(truc, truc$x), function(z) weighted.mean(z$y, z$w))


I hope it helps.

Best,
Dimitris

----
Dimitris Rizopoulos
Ph.D. Student
Biostatistical Centre
School of Public Health
Catholic University of Leuven

Address: Kapucijnenvoer 35, Leuven, Belgium
Tel: +32/(0)16/336899
Fax: +32/(0)16/337015
Web: http://www.med.kuleuven.be/biostat/
     http://www.student.kuleuven.be/~m0390867/dimitris.htm



----- Original Message ----- 
From: "Florent Bresson" <f_bresson at yahoo.fr>
To: "R-help" <r-help at stat.math.ethz.ch>
Sent: Thursday, January 12, 2006 3:44 PM
Subject: [R] tapply and weighted means
Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
#
Dimitris Rizopoulos wrote:
Or:
library(Hmisc)
?wtd.mean
The help file has a built-in example of this.
Frank

  
    
#
On Thu, 2006-01-12 at 15:44 +0100, Florent Bresson wrote:
Florent,

I guess you didn't read the help for tapply, which in the Value section
states:

     Note that optional arguments to 'FUN' supplied by the '...'
     argument are not divided into cells.  It is therefore
     inappropriate for 'FUN' to expect additional arguments with the
     same length as 'X'.

So tapply is not the right tool for this job. We can use by() instead (a
wrapper for tapply) as so:

dat <- matrix(scan(), byrow = TRUE, ncol = 3)
1  1  1
1  2  2
1  3  1
1  4  2
0  2  1
0  3  2
0  4  1
0  5  1

colnames(dat) <- c("x", "y", "w")
dat <- as.data.frame(dat)
dat
(res <- by(dat, dat$x, function(z) weighted.mean(z$y, z$w)))

but if you want to easily access the numbers you need to do a little
work, e.g.

as.vector(res)

Also, I don't see a function wtd.mean in standard R and weighted.mean()
doesn't have a weights argument, so I guess you are using a function
from another package and did not tell us.

HTH,

Gav