2013-10-17 61 views
6

有誰知道如何用絕對值排序R中的矢量,所以(-2, 3, 1) -> (1, -2, 3)等?按絕對值排序

如果我在python中創建它,我會創建一對每個值和它的符號,按絕對值排序對的列表,然後重新應用符號,但我對R很新,所以不知道這個怎麼做。

乾杯

+6

'×〔順序(ABS(X))]'? – Arun

+3

順便說一下,在Python中,執行'x.sort(key = abs)'而不是創建對 –

+0

非常感謝! –

回答

8

@ Arun的方法是TRT:

v[order(abs(v))] 

其中v是向量進行排序。

注:

  • 這產生相同的大小的v新向量abs(v)。 這不是很有記憶效率,但我不認爲這可以在R, 中像在Lisp:(sort #'< v :key #'abs)或Python:v.sort(key=abs)中所做的那樣避免。
  • 這個臨時向量分配並不一定是壞事:你確實失去了內存,但是你贏了時間,因爲訪問者密鑰只被調用N次,而不是N*log(N)次,這在密鑰不便宜時特別重要(不像abs或結構字段)。
  • 更準確地說,矢量abs(v)很快就會被垃圾收集,但是它的分配(尤其是garbage collection)對於大型矢量而言是昂貴的,並且如果內存很緊,可能會出現問題。

參見:

+0

但那個矢量是短暫的,不是嗎? –

+0

@Carl用於排序?這甚至有可能嗎? –

+0

@KonradRudolph我可能使用了錯誤的術語 - 矢量「abs(v)」不在父環境中並且在下一次垃圾收集時會消失?所以它可能會影響峯值RAM,但不會是永久性的。 –

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