[Rd] rank(, ties.method="last")
Marius Hofert
marius.hofert at uwaterloo.ca
Thu Oct 8 22:18:10 CEST 2015
Hi,
I ran into a problem where I actually need rank(, ties.method="last"). It would
be great to have this feature in base and it's also simple to get (see below).
Thanks & cheers,
Marius
rank2 <- function (x, na.last = TRUE, ties.method = c("average",
"first", "last", # new "last"
"random", "max", "min"))
{
nas <- is.na(x)
nm <- names(x)
ties.method <- match.arg(ties.method)
if (is.factor(x))
x <- as.integer(x)
x <- x[!nas]
y <- switch(ties.method, average = , min = , max = .Internal(rank(x,
length(x), ties.method)), first = sort.list(sort.list(x)),
last = sort.list(sort.list(x, decreasing=TRUE),
decreasing=TRUE), # change
random = sort.list(order(x, stats::runif(sum(!nas)))))
if (!is.na(na.last) && any(nas)) {
yy <- NA
NAkeep <- (na.last == "keep")
if (NAkeep || na.last) {
yy[!nas] <- y
if (!NAkeep)
yy[nas] <- (length(y) + 1L):length(yy)
}
else {
len <- sum(nas)
yy[!nas] <- y + len
yy[nas] <- seq_len(len)
}
y <- yy
names(y) <- nm
}
else names(y) <- nm[!nas]
y
}
## MWE
x <- c(10, 11, 11, 12, 12, 13)
rank(x, ties.method="first")
rank2(x, ties.method="last")
More information about the R-devel
mailing list