我目前正在循环中使用该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)
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)