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 fact:
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? Thanks, -- --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 ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.