R中的哪个.max绑定方法

by0*_*by0 14 r max min

which.maxwhich.min如果有联系,将返回最大或最小值的最小索引.

有没有办法解决这个问题,以便在影响函数效率的情况下返回最大的索引?

max.col 有这个确切的功能,但我正在处理一个矢量而不是矩阵.

Jou*_*ske 11

你可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

编辑:

或者,你也可以使用这样max.col的向量函数:

max.col(t(x),"last")
[1] 6
#or
max.col(matrix(x,nrow=1),"last")
[1] 6
Run Code Online (Sandbox Code Playgroud)

编辑:一些基准测试:

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
Run Code Online (Sandbox Code Playgroud)

因此,所有方法似乎都比原始方法慢(这会给出错误的结果),但z <- which(x == max(x));z[length(z)]似乎是这些方法的最快选择.


42-*_*42- 5

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
Run Code Online (Sandbox Code Playgroud)

使用 arr.ind 参数对于矩阵或数组结构特别有用,但它也适用于原子向量。


mne*_*nel 5

你可以逆转 x

which.max(rev(x))
which.min(rev(x))
Run Code Online (Sandbox Code Playgroud)