Rev 6452 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
\name{tapply}\title{Apply a Function Over a ``Ragged'' Array}\usage{tapply(X, INDEX, FUN = NULL, simplify = TRUE, \dots)}\alias{tapply}\arguments{\item{X}{an atomic object, typically a vector.}\item{INDEX}{list of factors, each of same length as \code{X}.}\item{FUN}{the function to be applied. In the case of functions like\code{+}, \code{\%*\%}, etc., the function name must be quoted. If\code{FUN} is \code{NULL}, tapply returns a vector which can be usedto subscript the multi-way array \code{tapply} normally produces.}\item{simplify}{If \code{FALSE}, \code{tapply} always returns an arrayof mode \code{"list"}. If \code{TRUE} (the default), then if\code{FUN} always returns a scalar, \code{tapply} returns an arraywith the mode of the scalar.}\item{\dots}{optional arguments to \code{FUN}.}}\value{When \code{FUN} is present, \code{tapply} calls \code{FUN} for eachcell that has any data in it. If \code{FUN} returns a single atomicvalue for each cell (e.g., functions \code{mean} or \code{var}) andwhen \code{simplify} is true,\code{tapply} returns a multi-way \link{array} containing the values. Thearray has the same number of dimensions as \code{INDEX} hascomponents; the number of levels in a dimension is the number oflevels (\code{nlevels(.)}) in the corresponding component of\code{INDEX}.Note that contrary to S, \code{simplify = TRUE} always returns anarray, possibly 1-dimensional.If \code{FUN} does not return a single atomic value, \code{tapply}returns an array of mode \code{\link{list}} whose components are thevalues of the individual calls to \code{FUN}, i.e., the result is alist with a \code{\link{dim}} attribute.}\seealso{the convenience function \code{\link{aggregate}} (using \code{tapply});\code{\link{apply}}, \code{\link{lapply}} with its version\code{sapply}.}\examples{groups <- as.factor(rbinom(32, n = 5, p = .4))tapply(groups, groups, length) #- is almost the same astable(groups)data(warpbreaks)## contingency table from data.frame : array with named dimnamestapply(warpbreaks$breaks, warpbreaks[,-1], sum)tapply(warpbreaks$breaks, warpbreaks[,3,drop=F], sum)n <- 17; fac <- factor(rep(1:3, len = n), levels = 1:5)table(fac)tapply(1:n, fac, sum)tapply(1:n, fac, sum, simplify = FALSE)tapply(1:n, fac, range)tapply(1:n, fac, quantile)ind <- list(c(1, 2, 2), c("A", "A", "B"))table(ind)tapply(1:3, ind) #-> the split vectortapply(1:3, ind, sum)}\keyword{iteration}\keyword{category}