8

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

如果我在 python 中做这件事,我会创建一对每个值及其符号,按绝对值对列表进行排序,然后重新应用符号,但我对 R 很陌生,所以不知道该怎么做.

干杯

4

2 回答 2

10

@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)很快就会被垃圾收集,但它的分配(尤其是垃圾收集)对于大型向量来说是昂贵的,如果内存紧张,实际上可能会出现问题。

也可以看看:

于 2013-10-17T19:13:11.900 回答
2

order我发现将它打包在一个函数中很有用,这样我就可以将一个向量传递给它,并且还可以选择在函数中使用其他选项,例如decreasing. 它本质上是基于现有的答案

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
于 2016-05-13T11:31:11.317 回答