[R] ave returns wrong type

OKB (not okblacke) brenbarn at brenbarn.net
Wed Apr 15 09:09:42 CEST 2009

    	I've been using the ave function to compute some statistics on a 
data frame.  After a while I noticed that, for some reason, it was 
returning numerical statistics as strings instead of numbers.  I delved 
into the code of the functions and traced the problem to the following 

    	ave uses split<- to do its work.  Specifically, it does "split(x, 
g) <- lapply(split(x, g), FUN)".  The problem is that this assigns the 
result of FUN into the original vector x, thus acquiring the mode of 
that vector.  So if you do ave(x, g, f) to apply f to x as grouped by g, 
and the result has the type of x, not the type that f returns.  So you 
get what strikes me as very annoying behavior, viz.:

>ave(rep(c("X", "Y"), 15), rep(c("A", "B", "C"), times=10), FUN=length)
"10" "10" "10" "10" "10" "10" "10" "10" "10" "10" "10" "10" "10" "10" 
"10" "10" "10" "10" "10" "10" "10" "10" "10" "10"
[25] "10" "10" "10" "10" "10" "10"

    	"length" returns numbers, so I want the result vector to contain 
numbers, obviously.  I can of course work around this by explicitly 
converting the result vector to the data type I want, but it seems silly 
for ave to do this.  ave applies a function to some stuff; the result 
should clearly depend on the RETURN TYPE of the function (as, for 
instance, tapply does it), not the type of the data being summarized by 
that function.

    	Is this just a bug?  Is there any known way to deal with this other 
than just manually casting the data to the type I need?

--OKB (not okblacke)
Brendan Barnwell
"Do not follow where the path may lead.  Go, instead, where there is
no path, and leave a trail."
	--author unknown

More information about the R-help mailing list