% File src/library/base/man/scale.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2018 R Core Team
% Distributed under GPL 2 or later

\name{scale}
\alias{scale}
\alias{scale.default}
\title{Scaling and Centering of Matrix-like Objects}
\description{
  \code{scale} is generic function whose default method centers and/or
  scales the columns of a numeric matrix.
}
\usage{
scale(x, center = TRUE, scale = TRUE)
}
\arguments{
  \item{x}{a numeric matrix(like object).}
  \item{center}{either a logical value or numeric-alike vector of length
    equal to the number of columns of \code{x}, where
    \sQuote{numeric-alike} means that \code{\link{as.numeric}(.)} will
    be applied successfully if \code{\link{is.numeric}(.)} is not true.}
  \item{scale}{either a logical value or a numeric-alike vector of length
    equal to the number of columns of \code{x}.}
}
\value{
  For \code{scale.default}, the centered, scaled matrix.  The numeric
  centering and scalings used (if any) are returned as attributes
  \code{"scaled:center"} and \code{"scaled:scale"}
}
\details{
  The value of \code{center} determines how column centering is
  performed.  If \code{center} is a numeric-alike vector with length equal to
  the number of columns of \code{x}, then each column of \code{x} has
  the corresponding value from \code{center} subtracted from it.  If
  \code{center} is \code{TRUE} then centering is done by subtracting the
  column means (omitting \code{NA}s) of \code{x} from their
  corresponding columns, and if \code{center} is \code{FALSE}, no
  centering is done.

  The value of \code{scale} determines how column scaling is performed
  (after centering).  If \code{scale} is a numeric-alike vector with length
  equal to the number of columns of \code{x}, then each column of
  \code{x} is divided by the corresponding value from \code{scale}.
  If \code{scale} is \code{TRUE} then scaling is done by dividing the
  (centered) columns of \code{x} by their standard deviations if
  \code{center} is \code{TRUE}, and the root mean square otherwise.
  If \code{scale} is \code{FALSE}, no scaling is done.

  The root-mean-square for a (possibly centered) column is defined as
  \eqn{\sqrt{\sum(x^2)/(n-1)}}{sqrt(sum(x^2)/(n-1))}, where \eqn{x} is
  a vector of the non-missing values and \eqn{n} is the number of
  non-missing values.  In the case \code{center = TRUE}, this is the
  same as the standard deviation, but in general it is not.  (To scale
  by the standard deviations without centering, use
  \code{scale(x, center = FALSE, scale = apply(x, 2, sd, na.rm = TRUE))}.)
}
\references{
  Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
  \emph{The New S Language}.
  Wadsworth & Brooks/Cole.
}
\seealso{
  \code{\link{sweep}} which allows centering (and scaling) with
  arbitrary statistics.

  For working with the scale of a plot, see \code{\link{par}}.
}
\examples{
require(stats)
x <- matrix(1:10, ncol = 2)
(centered.x <- scale(x, scale = FALSE))
cov(centered.scaled.x <- scale(x)) # all 1
}
\keyword{array}
