r-如何沿着数字向量标记当前最小值的索引,直到找到一个较小的索引



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

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()似乎非常相关。但我不知道如何使用它来获得想要的结果。

您可以使用:

which(v1 == cummin(v1))
[1] 1 3 5

如果你有重复的累积最小值,并且不想对重复项进行索引,你可以使用:

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

或者:

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

这是详细的方法:

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

创建于2021-12-08由reprex包(v2.0.1(

最新更新