[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