Метод меток .max в R

which.max и which.min вернут наименьший индекс максимального или минимального значения, если есть связи.

Есть ли способ обойти это так, чтобы наибольший индекс возвращался без, влияя на эффективность функции?

max.col имеет эту точную функциональность, но я имею дело с вектором, а не с матрицей.

Ответ 1

Вы можете сделать следующее:

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)] представляется наиболее быстрым вариантом.

Ответ 2

Функция 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 особенно полезно для матричных или массивных структур, но оно также работает с атомными векторами.

Ответ 3

Вы можете отменить x

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

Ответ 4

Чтобы расширить ответ 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