在R中创建替代系列

时间:2019-01-30 15:17:37

标签: r sorting

我有一个-0.5-0.60.711.53-5和我想将其排序为3-51.5-0.61-0.50.7。换句话说,我想将列表分为正列表和负列表,然后按从大到小的顺序对它们进行排序,但要交替进行。

我该怎么做?

4 个答案:

答案 0 :(得分:8)

数据

x <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)

使用rbind()创建备用索引向量。

ind <- seq_along(x)
sort(x, decreasing = T)[c(rbind(ind, rev(ind)))][ind]
# [1]  3.0 -5.0  1.5 -0.6  1.0 -0.5  0.7

上面的方法应该消耗内存,因为它将创建两倍的向量。要征服它,您可以将中点设置为结束索引。在这种情况下,它将是ceiling(7 / 2) = 4

n <- length(x)
ind <- 1:ceiling(n / 2) # [1] 1 2 3 4
sort(x, decreasing = T)[c(rbind(ind, (n:1)[ind]))][1:n]
# [1]  3.0 -5.0  1.5 -0.6  1.0 -0.5  0.7

答案 1 :(得分:5)

我们可以基于splitsign sort来创建列表。然后,我们通过从肯定列表和否定列表中选取交替元素来创建新列表,以确保rev将列表的肯定部分设置为

new_list <- sapply(split(x, sign(x)), sort)
c(rbind(rev(new_list[['1']]), new_list[['-1']]))[1:length(x)]
#[1]  3.0 -5.0  1.5 -0.6  1.0 -0.5  0.7

数据

x <- c(-0.5, -.6, 0.7, 1, 1.5, 3, -5 )

答案 2 :(得分:2)

一种选择是将{{1}的split的{​​{1}}到vector的{​​{1}}中,sign vectorlistvector顺序排列,元素的vector的整数值,用填充{{ 1}}的末尾,将它们order一起作为abs,用decreasing将其转换为lengths,并用{{1}删除list元素}

NA

数据

rbind

答案 3 :(得分:1)

怎么样

pos <- sort(x[x>0], decreasing = T)
neg <- sort(x[x<0], decreasing = T)

c(rbind(pos,neg))[1:length(x)]

#[1]  3.0 -0.5  1.5 -0.6  1.0 -5.0  0.7