我想获得最小值的索引,例如:
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(