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)]似乎是这些方法的最快选择.
该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 参数对于矩阵或数组结构特别有用,但它也适用于原子向量。
| 归档时间: |
|
| 查看次数: |
21118 次 |
| 最近记录: |