rank {base} | R Documentation |
Returns the sample ranks of the values in a vector. Ties (i.e., equal values) and missing values can be handled in several ways.
rank(x, na.last = TRUE,
ties.method = c("average", "first", "last", "random", "max", "min"))
x |
a numeric, complex, character or logical vector. |
na.last |
a logical or character string controlling the treatment
of |
ties.method |
a character string specifying how ties are treated, see ‘Details’; can be abbreviated. |
If all components are different (and no NA
s), the ranks are
well defined, with values in seq_along(x)
. With some values equal
(called ‘ties’), the argument ties.method
determines the
result at the corresponding indices. The "first"
method results
in a permutation with increasing values at each index set of ties, and
analogously "last"
with decreasing values. The
"random"
method puts these in random order whereas the
default, "average"
, replaces them by their mean, and
"max"
and "min"
replaces them by their maximum and
minimum respectively, the latter being the typical sports
ranking.
NA
values are never considered to be equal: for na.last =
TRUE
and na.last = FALSE
they are given distinct ranks in
the order in which they occur in x
.
NB: rank
is not itself generic but xtfrm
is, and rank(xtfrm(x), ....)
will have the desired result if
there is a xtfrm
method. Otherwise, rank
will make use
of ==
, >
, is.na
and extraction methods for
classed objects, possibly rather slowly.
A numeric vector of the same length as x
with names copied from
x
(unless na.last = NA
, when missing values are
removed). The vector is of integer type unless x
is a long
vector or ties.method = "average"
when it is of double type
(whether or not there are any ties).
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
order
and sort
;
xtfrm
, see above.
(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))