有没有更好的方法可以对整数 vector 进行重新排序,以使最大值位于中间,而最大值的两侧则减小。在重新排序的 vector 中,中间的值必须是最大的。接下来的两个大值必须在最大值的左边和右边(以任意值为准),依此类推。

#DATA
set.seed(42)
ints = sample(1:15, 51, replace = TRUE)

#CURRENT SOLUTION
ints2 = sort(ints, decreasing = TRUE)
left = c()
right = c()
for (i in seq_along(ints)){
    if (i %% 2 == 0){
        right = c(right, ints2[i])
    } else {
        left = c(left, ints2[i])
    }
}
ints2 = c(rev(left), right) #DESIRED OUTPUT

#Check if ints and ints2 have the same values
identical(sort(ints), sort(ints2))
#[1] TRUE

为了进一步说明,这是红色的初始数据和蓝色的重新排序数据的图。
#Initial Data
plot(x = seq_along(ints), y = ints, col = "red", type = "l", xlab = "index", ylab = "value")

#Re-ordered Data
lines(x = seq_along(ints2), y = ints2, col = "blue")

最佳答案

您可以执行以下操作:

i <- seq_along(ints)
r <- rank(-abs(i - median(i)), ties.method = "random")
sort(ints)[r]

说明:abs(i - median(i))为其距中心的距离的每个项获取一个序列,并且rank将其转换为索引,中心(最小距离)获得最大值(51)。然后,sort(ints)[r]将最后一个值放在此处,将其下一个最高值放在该值上,依此类推。

08-20 02:00