[R] Two-argument functions in tapply()

Douglas Bates bates at stat.wisc.edu
Thu Mar 22 15:52:23 CET 2001


"Michal Bojanowski" <buoy at wp.pl> writes:

> Hello to all.
> 
> My question is very simple...
> 
> Let's say we have a data frame with three variables (columns): X, W and F. X
> is a numeric variable (e.g. like income) F is a factor (e.g. with 2 levels)
> and W is a case weight (data are from household sample but an individual was
> interviewed, weights are functions of number of persons in the house hold).

> I wanted to compute a means of X weighted by W within groups defined by F
> with the function below:
> 
> 	wmean <- function(x,w)
> 		{
> 		wm <- sum( x*w/sum(w) )
> 		wm
> 		}
> 
> used within tapply() function, like:
> 
> 	tapply(x,f,wmean,w=w)
> 
> but I received some values with 2 warnings:
> 
> 	Warning messages:
> 	1: longer object length
> 	        is not a multiple of shorter object length in: x * w
> 	2: longer object length
>       	  is not a multiple of shorter object length in: x * w
> 
> What is the right way to get the results (how to use 2-argument function in
> tapply()), or maybe there is another simple way to do this

If you start with a data frame you should probably consider using
split to produce a list of subframes then lapply.  For example,
 lapply(split(frm, frm$f), function(fr) wmean(fr$x, fr$w))
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list