我有一个-0.5
,-0.6
,0.7
,1
,1.5
,3
,-5
和我想将其排序为3
,-5
,1.5
,-0.6
,1
,-0.5
,0.7
。换句话说,我想将列表分为正列表和负列表,然后按从大到小的顺序对它们进行排序,但要交替进行。
我该怎么做?
答案 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)
我们可以基于split
和sign
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
vector
,list
按vector
顺序排列,元素的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