2013-03-26 15 views
12

which.max und which.min wird den kleinsten Index des Max- oder Min-Wertes zurückgeben, wenn es Bindungen gibt.which.max bindet Methode in R

Gibt es eine Möglichkeit, dass der größte Index zurückgegeben ohne die Effizienz der Funktion beeinträchtigt?

max.col hat diese genaue Funktionalität, aber ich habe es mit einem Vektor keine Matrix.

Antwort

11

Sie könnten wie folgt tun:

x<-c(1,2,1,4,3,4) 
#identical to which.max, except returns all indices with max 
which(x==max(x)) 
[1] 4 6 
z<-which(x==max(x)) 
z[length(z)] 
[1] 6 
#or with tail 
tail(which(x==max(x)),1) 
[1] 6 

edit:

Oder man könnte auch max.col Funktion für Vektoren wie folgt verwenden:

max.col(t(x),"last") 
[1] 6 
#or 
max.col(matrix(x,nrow=1),"last") 
[1] 6 

edit: Einige Eckwerte:

x<-sample(1:1000,size=10000,replace=TRUE) 
library(microbenchmark) 
microbenchmark(which.max(x),{z<-which(x==max(x));z[length(z)]}, 
    tail(which(x==max(x)),1),max.col(matrix(x,nrow=1),"last"), 
    max.col(t(x),"last"),which.max(rev(x)),times=1000) 
Unit: microseconds 
              expr  min  lq median  uq  max neval 
            which.max(x) 29.390 30.323 30.323 31.256 17550.276 1000 
{  z <- which(x == max(x))  z[length(z)] } 40.586 42.452 42.919 44.318 631.178 1000 
         tail(which(x == max(x)), 1) 57.380 60.646 61.579 64.844 596.657 1000 
      max.col(matrix(x, nrow = 1), "last") 134.353 138.085 139.485 144.383 710.949 1000 
          max.col(t(x), "last") 116.159 119.425 121.291 125.956 729.610 1000 
           which.max(rev(x)) 89.569 91.435 92.368 96.566 746.404 1000 

Also scheinen alle Methoden langsamer zu sein als das Original (was ein falsches Ergebnis liefert), aber z <- which(x == max(x));z[length(z)] scheint die schnellste Option von diesen zu sein.

+0

Benchmarking ist schön! Danke, ich denke, ich werde mit Option 2 gehen! 'z <- was (x == max (x)) z [Länge (z)]' – by0

4

which Die Funktion eines ‚arr.ind‘ Parameter hat normalerweise auf FALSE gesetzt, aber sinnvollerweise auf TRUE gesetzt in diesem Fall:

x <- sample(1:20, 50, repl=TRUE) 

> which(x==max(x), arr.ind=TRUE) 
[1] 11 23 
> tail(which(x==max(x), arr.ind=TRUE) , 1) 
[1] 23 

das Argument arr.ind Verwendung ist besonders nützlich mit Matrix- oder Array-Strukturen, aber es funktioniert auch mit atomaren Vektoren.

+0

Dwin ist Gibt es einen Unterschied bei der Einstellung von 'arr.ind = TRUE' für Vektoren? – Arun

+1

Ich glaube nicht. Ich hätte wahrscheinlich 'which' verwenden sollen. Manchmal überlege ich. –

4

Sie könnten Reverse x

which.max(rev(x)) 
which.min(rev(x)) 
0

auf Jouni Antwort zu erweitern, Sie stattdessen max auf dem Ergebnis der which verwenden:

x <- c(1, 2, 1, 4, 3, 4) 
which(x == max(x)) 
[1] 4 6 
max(which(x == max(x))) 
[1] 6 

Benchmarking:

x <- sample(1:1000, size = 10000, replace = TRUE) 
library(microbenchmark) 
microbenchmark(which.max(x), {z <- which(x == max(x)); z[length(z)]}, 
       tail(which(x == max(x)), 1), max.col(matrix(x, nrow = 1), "last"), 
       max.col(t(x), "last"), which.max(rev(x)), max(which(x == max(x))), times = 1000) 
Unit: microseconds 
              expr  min  lq  mean median  uq  max neval 
            which.max(x) 6.322 6.717 7.171838 7.112 7.112 40.297 1000 
{  z <- which(x == max(x))  z[length(z)] } 27.260 28.445 37.126964 28.840 29.630 2276.346 1000 
         tail(which(x == max(x)), 1) 35.952 37.927 45.198484 38.718 40.298 1005.038 1000 
      max.col(matrix(x, nrow = 1), "last") 160.791 162.766 181.698171 163.557 169.087 1688.494 1000 
          max.col(t(x), "last") 84.149 86.124 100.249921 86.915 89.680 1230.618 1000 
           which.max(rev(x)) 53.729 55.310 69.442985 56.100 57.680 1076.149 1000 
          max(which(x == max(x))) 26.865 27.655 35.552256 28.050 28.841 1029.137 1000 
Verwandte Themen