如何沿数值向量移动并标记当前最小值的索引,直到找到一个更小的值?
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)
我想获取最小值的索引,例如:
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)