Angenommen, ich habe Folgendes data.table
in R
:
library(data.table)
DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
Ich möchte es nach zwei Spalten ordnen (sagen wir Spalten x
und v
). Ich habe das benutzt:
DT[order(x,v)] # sorts first by x then by v (both in ascending order)
Aber jetzt möchte ich es sortieren x
(in absteigender Reihenfolge) und den folgenden Code haben:
DT[order(-x)] #Error in -x : invalid argument to unary operator
Daher denke ich, dass dieser Fehler auf die Tatsache zurückzuführen ist, dass class(DT$x)=character
. Können Sie mir einen Vorschlag machen, um dieses Problem zu lösen?
Ich weiß, dass ich verwenden kann DT[order(x,decreasing=TRUE)]
, aber ich möchte die Syntax kennen, nach der mehrere Spalten gleichzeitig in beide Richtungen (einige abnehmend, andere zunehmend) sortiert werden.
Beachten Sie, dass bei Verwendung DT[order(-y,v)]
das Ergebnis in Ordnung ist, bei Verwendung DT[order(-x,v)]
jedoch ein Fehler auftritt. Meine Frage lautet also: Wie kann dieser Fehler behoben werden?
DT[order(-x)]
keine äquivalente Aussage ist,setorder(DT, -x)
weil essetorder()
tatsächlich wirkt,DT
während das andere nicht handelt. Äquivalente Aussagen wären DT <- DT [order (-x)] setorder (DT, -x) Ich bin sehr neu in R, bitte korrigieren Sie, wenn ich mich irre.Antworten:
Aktualisieren
data.table v1.9.6 + unterstützt jetzt den ursprünglichen Versuch von OP und die folgende Antwort ist nicht mehr erforderlich.
Sie können verwenden
DT[order(-rank(x), y)]
.quelle
Sie können nur
-
numerische Einträge verwenden, sodass Sie die gewünschten Einträge in aufsteigender Reihenfolge verringern und negieren können:quelle
character
Spalten und möchten eine zunehmende und eine abnehmende sortieren.DT[order(x,-rank(w),decreasing=TRUE)]
vorausgesetzt, dassx
undw
beide Zeichenspalten sind. Danke dir!DT[order(-x)]
funktioniert wie erwartet. Ich habe data.table Version 1.9.4. Möglicherweise wurde dies in einer neueren Version behoben.Außerdem schlage ich die
setorder(DT, -x)
Syntax vor, die den set * -Befehlen entspricht, wie zsetnames
.setkey
quelle