有谁知道如何按绝对值对 R 中的向量进行排序,(-2, 3, 1) -> (1, -2, 3)
等等?
如果我在 python 中做这件事,我会创建一对每个值及其符号,按绝对值对列表进行排序,然后重新应用符号,但我对 R 很陌生,所以不知道该怎么做.
干杯
@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)
很快就会被垃圾收集,但它的分配(尤其是垃圾收集)对于大型向量来说是昂贵的,如果内存紧张,实际上可能会出现问题。也可以看看:
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