2013-10-17 28 views
6

Kann jemand einen Vektor in R nach Absolutwert sortieren, also (-2, 3, 1) -> (1, -2, 3) usw.?Nach Absolutwert sortieren

Wenn ich es in Python tun würde, würde ich ein Paar von jedem Wert und seinem Vorzeichen erstellen, die Liste der Paare nach dem absoluten Wert sortieren und dann das Zeichen erneut anwenden, aber ich bin sehr neu zu R, also habe keine Ahnung Wie macht man das.

Prost

+6

'x [Ordnung (abs (x))]'? – Arun

+3

Übrigens wäre es in Python einfacher 'x.sort (key = abs)' 'zu machen als die Paare –

+0

zu erstellen. Vielen Dank! –

Antwort

8

@ Methode Arun ist TRT:

v[order(abs(v))] 

wo v den Vektor sortiert werden soll.

Hinweise:

  • Dieser neue Vektor als vabs(v) der gleichen Größe erzeugt. Dies ist nicht sehr speichereffizient, aber ich denke nicht, dass dies in R, vermieden werden kann, wie es z. B. in Lisp: (sort #'< v :key #'abs) oder Python: v.sort(key=abs) gemacht wird.
  • Diese Temp-Vektor-Zuordnung ist nicht unbedingt eine schlechte Sache: Sie verlieren Speicher, aber Sie gewinnen Zeit, weil der Accessor-Schlüssel nur N Mal aufgerufen wird, nicht N*log(N) mal, was besonders wichtig ist, wenn der Schlüssel nicht billig ist (im Gegensatz abs oder ein Strukturfeld).
  • Um genauer zu sein, ist der Vektor abs(v) sehr bald Müll gesammelt, aber seine Zuordnung (und vor allem garbage collection) sind teuer für große Vektoren und kann tatsächlich problematisch sein, wenn der Speicher eng ist.

Siehe auch:

+0

Aber dieser Vektor ist vergänglich, nicht wahr? –

+0

@Carl Zum Sortieren? Ist das überhaupt möglich? –

+0

@KonradRudolph Ich habe vielleicht den falschen Begriff verwendet - ist es nicht wahr, dass der Vektor 'abs (v)' nicht in der Eltern-Umgebung ist & wird bei der nächsten Garbage Collection verschwinden? Das kann den Spitzen-RAM beeinflussen, ist aber nicht dauerhaft. –

1

Ich fand es nützlich, diese in einer Funktion zu verpacken, so dass ich einen Vektor, um es passieren konnte, und auch, so dass es die Möglichkeit gab, andere Optionen in der order Funktion wie 0 zu verwenden. Es basiert im Wesentlichen auf the existing answer.

sort_abs <- function(x, na.last = TRUE, decreasing = FALSE) { 
    x[order(abs(x), na.last = na.last, decreasing = decreasing)] 
} 

Zum Beispiel

> 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