如何沿数值向量移动并标记当前最小值的索引,直到找到一个更小的值?

How to go along a numeric vector and mark the index of currently minimal value until finding a smaller one?

我想获取最小值的索引,例如:

v1 <- c(20, 30, 5, 18, 2, 10, 8, 4)

结果是:

1 3 5

解释:

超过 v1,我们从值 20 开始。在不继续前进的情况下,我们注意到最小值 (20) 及其索引 (1)。我们忽略相邻元素,因为它大于 20。所以 20 仍然保持着最小的记录。然后我们移动到 5,它比 20。现在 5 是最小的,我们记下它的索引 (3)。由于 18 不小于迄今为止的获胜者 (5),我们忽略它并继续向右走。由于 2 是迄今为止最小的,因此它是新的获胜者并且它的位置被记录下来 (5)。没有小于 2 的值向右移动,就是这样。最后,职位是:

1 # for `20` 
3 # for `5`
5 # for `2`

显然,输出应该始终以 1 开头,因为我们永远不知道接下来会发生什么。

另一个例子:

v2 <- c(7, 3, 4, 4, 4, 10, 12, 2, 7, 7, 8)

# output: 
1 2 8

Which.min() 似乎很相关。但我不确定如何使用它来获得所需的结果。

这是冗长的方式:

library(purrr)

v1 <- c(20, 30, 5, 18, 2, 10, 8, 4)

v1 %>%
  length() %>%
  seq() %>%
  map_dbl(~ which.min(v1[1: .x])) %>%
  unique()
#> [1] 1 3 5

reprex package (v2.0.1)

于 2021-12-08 创建

您可以使用:

which(v1 == cummin(v1))

[1] 1 3 5

如果您有重复的累积最小值并且不想将重复项编入索引,您可以使用:

which(v1 == cummin(v1) & !duplicated(v1))

或者:

match(unique(cummin(v1)), v1)