对于向量中的每个值,获取相应的下一个最小值
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
对于向量中的每个元素,我想要向量中相应的下一个较小的值,而不改变元素的原始顺序。
例如,假设给定的向量是:
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