有谁知道如何用R绝对值对R中的向量进行排序,所以(-2, 3, 1) -> (1, -2, 3)
等?
如果我在python中这样做,我会创建一对每个值及其符号,按绝对值对对列表进行排序,然后重新应用符号,但我对R很新,所以不知道如何这样做。
干杯
答案 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