2013-10-17 5 views
6

誰でもRで絶対値でベクトルをソートする方法を知っていますので、(-2, 3, 1) -> (1, -2, 3)などですか?絶対値で並べ替え

もし私がPythonでやっていたら、すべての値と記号のペアを作成し、絶対値でペアのリストをソートして符号を再適用しますが、Rにはとても新しいので、分かりませんこれを行う方法。

Arunのメソッド@乾杯

+6

'のX [順序(ABS(X))]'? – Arun

+3

ちなみに、Pythonでは、ペアを作成するのではなく、 'x.sort(key = abs)'を行う方が簡単です –

+0

ありがとう! –

答えて

8

はTRTです:

vをソートするベクトルである
v[order(abs(v))] 

注:これはvと同じサイズの新しいベクトルabs(v)を作成

  • 。 これはメモリー効率はあまり高くありませんが、例えばLisp:(sort #'< v :key #'abs)やPython:v.sort(key=abs)などのように、R、 で回避できないとは思いません。
  • アクセントキーがN回だけで、N*log(N)回ではなく、キーが安くない場合には(absとは異なります)呼び出されるため、メモリを失うことはありません。または構造フィールド)。
  • より正確には、ベクトルabs(v)はすぐにガベージコレクションされますが、その割り当て(および、特にgarbage collection)は大きなベクトルの場合には高価であり、メモリが逼迫している場合は実際に問題になることがあります。

参照:

+0

しかし、そのベクトルは一時的ですね。 –

+0

@Carlソートするには?それも可能ですか? –

+0

@KonradRudolph間違った用語を使用した可能性があります - ベクトルabs(v)が親環境になく、次のガベージコレクションで消えてしまうのは本当ですか?したがって、ピークRAMに影響する可能性がありますが、永続的ではありません。 –

1

私はそれにベクトルを渡すことができるようにそれは便利な機能で、これをパッケージ化することが判明、 0のようなorderの関数で他のオプションを使うオプションがあるように。これは基本的に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 
関連する問題