【发布时间】:2022-01-07 06:57:03
【问题描述】:
对于向量中的每个元素,我想要向量中对应的下一个较小的值,而不改变元素的原始顺序。
例如,假设给定的向量是:
c(4, 5, 5, 10, 3, 7)
那么结果就是:
c(3, 4, 4, 7, 0, 5)
请注意,由于 3 没有任何更小的值,我希望将其替换为 0。 任何帮助都感激不尽。谢谢。
【问题讨论】:
对于向量中的每个元素,我想要向量中对应的下一个较小的值,而不改变元素的原始顺序。
例如,假设给定的向量是:
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
【讨论】:
v 由于outer 时
使用findInterval:
sx = sort(x)
i = findInterval(x, sx, left.open = TRUE)
sx[replace(i, i == 0, NA)]
# [1] 3 4 4 7 NA 5
【讨论】:
findInterval 解决方案,+1!