Re: [R] which.max2()

From: Marc Schwartz <marc_schwartz_at_comcast.net>
Date: Fri, 09 May 2008 10:11:15 -0500

on 05/09/2008 08:07 AM Esmail Bonakdarian wrote:
> Hello,
>
> which.max() only returns one index value, the one for the
> maximum value. If I want the two index values for the two
> largest values, is this a decent solution, or is there a
> nicer/better R'ish way?
>
> max2 <-function(v)
> {
> m=which.max(v)
> v[m] = -v[m]
> m2=which.max(v)
> result=c(m, m2)
> result
> }
>
> Seems to work ok.
>
> Thanks,
> Esmail

I might be tempted to take a more generic approach, where one can provide an argument to the function to indicate that I want the 'top x' maximum values and to give the user the option of returning the indices or the values themselves.

Perhaps:

which.max2 <- function(x, top = 1, values = FALSE) {

   if (values)
     rev(sort(x))[1:top]
   else

     order(x, decreasing = TRUE)[1:top]
}

set.seed(1)
Vec <- rnorm(10)

 > Vec
  [1] -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078 -0.8204684   [7] 0.4874291 0.7383247 0.5757814 -0.3053884

 > which.max2(Vec, 2)
[1] 4 8

 > which.max2(Vec, 2, values = TRUE)
[1] 1.5952808 0.7383247

HTH, Marc Schwartz



R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Fri 09 May 2008 - 16:16:07 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 09 May 2008 - 18:30:35 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive