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

时间:2018-03-30 07:51:51

标签: r

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

vec <- c(0,0,2,0,2)

然后该函数将始终返回:

> which.max(vec)
[1] 3

我想知道是否有一个简单的解决方案可以随机打破关系,因此它并不总是选择关系中最小的索引。我知道which.is.max中有一个nnet函数,但希望看到是否有另一个简单的解决方案,而无需安装额外的软件包。感谢。

4 个答案:

答案 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)

另一种方法是将rankties.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)])