[ top | up ]

Apply a Function Over a "Ragged" Array

Syntax

tapply(x, INDEX, FUN = NULL, simplify = TRUE, ...)

Arguments

x an atomic object, typically a vector.
INDEX list of factors, each of same length as x.
FUN the function to be applied. In the case of functions like +, %*%, etc., the function name must be quoted. If FUN is NULL, tapply returns a vector which can be used to subscript the multi-way array tapply normally produces.
simplify If FALSE, tapply will always return an array of mode list. If TRUE (the default), then if FUN always returns a scalar, the tapply will return an array with the mode of the scalar, and if the array would be one dimensional the dimension is removed, to make it a vector.
... optional arguments to FUN.

Value

When FUN is present, tapply calls FUN for each cell that has any data in it. If FUN returns a single atomic value for each cell (e.g. functions mean or var), then tapply returns a multi-way array containing the values. The array has the same number of dimensions as INDEX has components; the number of levels in a dimension is the number of levels (nlevels(.)) in the corresponding component of INDEX. This is a vector if INDEX has only one component.

If FUN does not return a single atomic value, tapply returns an array of mode "list" whose components are the values of the individual calls to FUN, i.e., the result is a list with a dim attribute.

See Also

apply, lapply with its version sapply.

Examples

groups <- as.factor(rbinom(32,n=5,p=.4)) tapply(groups, groups, length)#- is almost the same as table(groups) 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 = F)#- does not yet print okay ind <- list(c(1,2,2), c("A","A","B")) table(ind) tapply(1:3, ind)#-> the split vector tapply(1:3, ind, sum)