对于向量中的每个值,获取相应的下一个最小值

For each value in a vector get the corresponding next smallest value

对于向量中的每个元素,我想要向量中相应的下一个较小的值,而不改变元素的原始顺序。

例如,假设给定的向量是:

c(4, 5, 5, 10, 3, 7)

那么结果就是:

c(3, 4, 4, 7, 0, 5)

请注意,由于 3 没有任何更小的值,因此我希望将其替换为 0。 任何帮助都感激不尽。谢谢。

我们可以使用

sapply(v1, function(x) sort(v1)[match(x, sort(v1))-1][1])
[1]  3  4  4  7 NA  5

或使用矢量化选项

v2 <- unique(v1)
v3 <- sort(v2)
v4 <-  v3[-length(v3)]
i1 <- match(v1, v3) - 1
i1[i1 == 0] <- NA
v4[i1]
[1]  3  4  4  7 NA  5

数据

v1 <- c(4, 5, 5, 10, 3, 7)

我们可以使用 outer + max.col

尝试下面的代码
> m <- outer(v, u <- sort(unique(v)), `>`)

> replace(u[max.col(m, ties.method = "last")], rowSums(m) == 0, NA)
[1]  3  4  4  7 NA  5

使用findInterval:

sx = sort(x)
i = findInterval(x, sx, left.open = TRUE)
sx[replace(i, i == 0, NA)]
# [1]  3  4  4  7 NA  5