按绝对值排序

时间:2013-10-17 19:02:41

标签: r sorting

有谁知道如何用R绝对值对R中的向量进行排序,所以(-2, 3, 1) -> (1, -2, 3)等?

如果我在python中这样做,我会创建一对每个值及其符号,按绝对值对对列表进行排序,然后重新应用符号,但我对R很新,所以不知道如何这样做。

干杯

2 个答案:

答案 0 :(得分:8)

@ Arun的方法是TRT:

v[order(abs(v))]

其中v是要排序的向量。

注意:

  • 这会创建一个与abs(v)大小相同的新向量v。 这不是很节省内存,但我不认为R可以避免这种情况, 就像它在例如Lisp:(sort #'< v :key #'abs)或Python中完成的那样:v.sort(key=abs)
  • 这个临时矢量分配不一定是坏事:你确实会失去记忆,但是你赢了时间,因为访问者密钥只被N次调用,而不是N*log(N)次,这一点尤其重要。密钥不便宜(与abs或结构字段不同)。
  • 更确切地说,向量abs(v)很快就会被垃圾收集,但是它的分配(尤其是garbage collection)对于大型向量来说是昂贵的,如果内存紧张可能会有问题

另见:

答案 1 :(得分:1)

我发现将它封装在一个函数中是有用的,这样我就可以向它传递一个向量,并且还可以选择在order函数中使用其他选项,如decreasing。它基本上基于the existing answer

sort_abs <- function(x, na.last = TRUE, decreasing = FALSE) {
    x[order(abs(x), na.last = na.last, decreasing = decreasing)] 
}

例如,

> sort_abs(c(-1,NA,2,-2))
[1] -1  2 -2 NA
> sort_abs(c(-1,NA,2,-2), decreasing = TRUE, na.last = FALSE)
[1] NA  2 -2 -1