我目前正在循环中使用which.max()
中的R
函数。有时,我有一个包含相同元素的向量,如:
vec <- c(0,0,2,0,2)
然后该函数将始终返回:
> which.max(vec)
[1] 3
我想知道是否有一个简单的解决方案可以随机打破关系,因此它并不总是选择关系中最小的索引。我知道which.is.max
中有一个nnet
函数,但希望看到是否有另一个简单的解决方案,而无需安装额外的软件包。感谢。
答案 0 :(得分:14)
which(vec == max(vec))
将匹配所有关系。然后,您可以使用sample(which(vec == max(vec)), 1)
随机选择一个。
正如你在评论中提到的那样,sample
在提供的向量长度为1时会做一些烦人的事情。所以当只有一个最大值时。{/ p>
您可以按照以下方式解决此问题:
maxima <- which(vec == max(vec))
if(length(maxima) > 1){
maxima <- sample(maxima, 1)
}
答案 1 :(得分: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
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
答案 2 :(得分:0)
有一个名为“pertubation”的概念,您可以使用明显小于现有变体的随机数量修改每个数字。然后,您可以获取最大金额,这将是原始最大值加上一些随机金额之一。将选择哪一个原始最大值是随机的,因为它确定了哪个具有最大的随机量。因此,例如,如果所有数字都是整数,则可以将它们转换为浮点数,在0和.001之间添加一个随机数,选择最大数字,然后将其舍入为int。这可能不是最有效的方法,但鉴于你提到了which.is.max
中的nnet
,大概是你正在使用神经网络,而插入是NN的一个重要概念。
答案 3 :(得分:0)
作为替代方案:
vec <- c(0,0,2,0,2)
vec %>% unique %>% sapply(function(x) which(x==vec)[sample(x=length(which(x==vec)),1)])