Den 2015-10-09 kl. 12:14, skrev Martin Maechler:

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")

Indeed, this makes sense to me, and is easy enough to document
and maintain, and preferable to asking useRs to use  rev(.) and
similar "easy" (but somewhat costly for large data!)
transformations to get the same....

Or have (Marius Hofert and I) overlooked something obvious ?

I think so: the code above doesn't seem to do the right thing. Consider the following example:

> x <- c(1, 1, 2, 3)
> rank2(x, ties.method = "last")
[1] 1 2 4 3

That doesn't look right to me -- I had expected

> rev(sort.list(x, decreasing = TRUE))
[1] 2 1 3 4


Henric Winell




Martin Maechler,
ETH Zurich

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to