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

\name{rank}
\alias{rank}
\title{Sample Ranks}
\description{
  Returns the sample ranks of the values in a vector.  Ties (i.e., equal
  values) and missing values can be handled in several ways.
}
\usage{
rank(x, na.last = TRUE,
     ties.method = c("average", "first", "last", "random", "max", "min"))
}
\arguments{% x: actually, only  x[!is.na(x)]  must be such a vector
  \item{x}{a numeric, complex, character or logical vector.}
  \item{na.last}{a logical or character string controlling the treatment
    of \code{\link{NA}}s. If \code{TRUE}, missing values in the data are
    put last; if \code{FALSE}, they are put first; if \code{NA}, they
    are removed; if \code{"keep"} they are kept with rank \code{NA}.}
  \item{ties.method}{a character string specifying how ties are treated,
    see \sQuote{Details}; can be abbreviated.}
}
\references{
  Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
  \emph{The New S Language}.
  Wadsworth & Brooks/Cole.
}
\details{
  If all components are different (and no \code{NA}s), the ranks are
  well defined, with values in \code{seq_along(x)}.  With some values equal
  (called \sQuote{ties}), the argument \code{ties.method} determines the
  result at the corresponding indices.  The \code{"first"} method results
  in a permutation with increasing values at each index set of ties, and
  analogously \code{"last"} with decreasing values.  The
  \code{"random"} method puts these in random order whereas the
  default, \code{"average"}, replaces them by their mean, and
  \code{"max"} and \code{"min"} replaces them by their maximum and
  minimum respectively, the latter being the typical sports
  ranking.

  \code{NA} values are never considered to be equal: for \code{na.last =
    TRUE} and \code{na.last = FALSE} they are given distinct ranks in
  the order in which they occur in \code{x}.

  \strong{NB}: \code{rank} is not itself generic but \code{\link{xtfrm}}
  is, and \code{rank(xtfrm(x), ....)} will have the desired result if
  there is a \code{xtfrm} method.  Otherwise, \code{rank} will make use
  of \code{==}, \code{>}, \code{is.na} and extraction methods for
  classed objects, possibly rather slowly.
}
\value{
  A numeric vector of the same length as \code{x} with names copied from
  \code{x} (unless \code{na.last = NA}, when missing values are
  removed).  The vector is of integer type unless \code{x} is a long
  vector or \code{ties.method = "average"} when it is of double type
  (whether or not there are any ties).
}
\seealso{
  \code{\link{order}} and \code{\link{sort}};
  \code{\link{xtfrm}}, see above.
}
\examples{
(r1 <- rank(x1 <- c(3, 1, 4, 15, 92)))
x2 <- c(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)
names(x2) <- letters[1:11]
(r2 <- rank(x2)) # ties are averaged

## rank() is "idempotent": rank(rank(x)) == rank(x) :
stopifnot(rank(r1) == r1, rank(r2) == r2)

## ranks without averaging
rank(x2, ties.method= "first")  # first occurrence wins
rank(x2, ties.method= "last")   #  last occurrence wins
rank(x2, ties.method= "random") # ties broken at random
rank(x2, ties.method= "random") # and again

## keep ties ties, no average
(rma <- rank(x2, ties.method= "max"))  # as used classically
(rmi <- rank(x2, ties.method= "min"))  # as in Sports
stopifnot(rma + rmi == round(r2 + r2))

## Comparing all tie.methods:
tMeth <- eval(formals(rank)$ties.method)
rx2 <- sapply(tMeth, function(M) rank(x2, ties.method=M))
cbind(x2, rx2)
## ties.method's does not matter w/o ties:
x <- sample(47)
rx <- sapply(tMeth, function(MM) rank(x, ties.method=MM))
stopifnot(all(rx[,1] == rx))
}
\keyword{univar}
