\Header{split}{Divide into Groups}
\methalias{split.data.frame}{split}
\alias{split.data.frame<\Rdash}{split}
\alias{split.default}{split}
\alias{split<\Rdash}{split}
\methalias{split<\Rdash.data.frame}{split}
\methalias{split<\Rdash.default}{split}
\alias{unsplit}{split}
\keyword{category}{split}
\begin{Description}\relax
\code{split} divides the data in the vector \code{x} into the groups
defined by \code{f}. The assignment forms replace values
corresponding to such a division. Unsplit reverses the efffect of
\code{split}\end{Description}
\begin{Usage}
\begin{verbatim}
split(x, f)
split.default(x, f)
split.data.frame(x, f)
split(x, f) <- value
split.default(x, f) <- value
split.data.frame(x, f) <- value
unsplit(value, f)
\end{verbatim}
\end{Usage}
\begin{Arguments}
\begin{ldescription}
\item[\code{x}] vector or data frame containing values to be divided into groups.
\item[\code{f}] a ``factor'' such that \code{factor(f)} defines the grouping,
or a list of such factors in which case their interaction is used
for the grouping.
\item[\code{value}] a list of vectors or data frames compatible with a
splitting of \code{x}
\end{ldescription}
\end{Arguments}
\begin{Details}\relax
\code{f} is recycled as necessary and if the length of \code{x} is not
a multiple of the length of \code{f} a warning is printed.
\code{unsplit} works only with  lists of vectors. The data frame
method can also be used to split a matrix into a list of matrices,
and the assignment form likewise, provided they are invoked
explicitly.\end{Details}
\begin{Value}
The value returned from \code{split} is a list of vectors containing
the values for the  
groups.  The components of the list are named by the factor levels
given be \code{f}.  If \code{f} is longer than \code{x} some of these
will be of zero length. The assignment forms return their right hand side. 
\code{unsplit} returns a vector for which \code{split(x, f)} equals
\code{value}\end{Value}
\begin{SeeAlso}\relax
\code{\Link{cut}}\end{SeeAlso}
\begin{Examples}
\begin{ExampleCode}
n <- 10; nn <- 100
g <- factor(round(n * runif(n * nn)))
x <- rnorm(n * nn) + sqrt(as.numeric(g))
xg <- split(x, g)
boxplot(xg, col = "lavender", notch = TRUE, varwidth = TRUE)
sapply(xg, length)
sapply(xg, mean)

## Calculate z-scores by group

z <- unsplit(lapply(split(x, g), scale), g)
tapply(z, g, mean)

# or

z <- x
split(z, g) <- lapply(split(x, g), scale)
tapply(z, g, sd)

## Split a matrix into a list by columns
ma <- cbind(x = 1:10, y = (-4:5)^2)
split(ma, col(ma))

split(1:10, 1:2)
\end{ExampleCode}
\end{Examples}

