web-dev-qa-db-ja.com

which.maxはRのメソッドを結びます

which.maxおよびwhich.minは、同点の場合、最大値または最小値の最小のインデックスを返します。

最大のインデックスが返されるようにこれを回避する方法はありますかなし関数の効率に影響を与えますか?

max.colにはこの正確な機能がありますが、私は行列ではなくベクトルを扱っています。

16
by0

あなたはこのようにすることができます:

_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
_

編集:

または、次のようなベクトルに_max.col_関数を使用することもできます。

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

編集:いくつかのベンチマーク:

_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
_

したがって、すべてのメソッドは元のメソッドよりも遅いように見えますが(間違った結果が得られます)、z <- which(x == max(x));z[length(z)]がこれらの中で最も速いオプションのようです。

11
Jouni Helske

xを逆にすることができます

which.max(rev(x))
which.min(rev(x))
5
mnel

which関数の 'arr.ind'パラメーターは通常FALSEに設定されていますが、この場合はTRUEに設定すると便利です。

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

Arr.ind引数の使用は、行列または配列構造で特に役立ちますが、アトミックベクトルでも機能します。

4
42-

Jouniの答えを拡張するには、代わりにmaxの結果にwhichを使用できます。

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

ベンチマーク:

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
1
BobbyBean