有没有办法在R函数which.max()中的关系中随机抽样?

use*_*627 8 r

我目前正在循环中使用该which.max()函数R.有时,我有一个包含相同元素的向量,例如:

vec <- c(0,0,2,0,2)
Run Code Online (Sandbox Code Playgroud)

然后该函数将始终返回:

> which.max(vec)
[1] 3
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一个简单的解决方案来随机打破关系,以便它不总是选择关系中最小的索引.我知道有一个which.is.max功能nnet,但希望看到是否有另一个简单的解决方案,而无需安装额外的包.谢谢.

JAD*_*JAD 14

which(vec == max(vec))将匹配所有关系.然后你可以随机选择一个sample(which(vec == max(vec)), 1).

正如你在评论中提到的那样,sample当提供的向量长度为​​1时,会出现什么问题.所以当只有一个最大值时.

您可以按如下方式解决此问题:

maxima <- which(vec == max(vec))
if(length(maxima) > 1){
  maxima <- sample(maxima, 1)
}
Run Code Online (Sandbox Code Playgroud)

  • 看来,如果有一个明确的最大值(即只有一个值是最大值,如`c(0,0,1,0`),那么这个代码就有样本(3,1),然后来自`1,2,3`池的样本.当有一个不同的最大值时,有没有办法阻止它的采样? (3认同)

Ron*_*hah 10

另一种方法是使用rank,ties.method = "random"然后我们可以使用which.max它.

which.max(rank(vec, ties.method = "random"))

which.max(rank(vec, ties.method = "random"))
#[1] 3

which.max(rank(vec, ties.method = "random"))
#[1] 5
Run Code Online (Sandbox Code Playgroud)

rank它基本上会根据它们的值对矢量进行排名,并且ties.method = "random"它会在一个平局的情况下随机分配排名.

rank(vec, ties.method = "random")
#[1] 2 1 4 3 5

rank(vec, ties.method = "random")
#[1] 1 3 5 2 4
Run Code Online (Sandbox Code Playgroud)

  • @downvoter我说的是不正确的?很乐意纠正它:) (2认同)