Disons que j'ai ce qui suit data.table
dans R
:
library(data.table)
DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
Je veux le commander par deux colonnes (disons colonnes x
et v
). J'ai utilisé ceci:
DT[order(x,v)] # sorts first by x then by v (both in ascending order)
Mais maintenant, je veux le trier par x
( par ordre décroissant) et avoir le code suivant:
DT[order(-x)] #Error in -x : invalid argument to unary operator
Par conséquent, je pense que cette erreur est due au fait que class(DT$x)=character
. Pouvez-vous me donner des suggestions pour résoudre ce problème?
Je sais que je peux utiliser DT[order(x,decreasing=TRUE)]
, mais je veux connaître la syntaxe pour trier par plusieurs colonnes en utilisant les deux méthodes (certaines décroissantes, certaines croissantes) en même temps.
Notez que si vous utilisez DT[order(-y,v)]
le résultat est ok, mais si vous utilisez DT[order(-x,v)]
il y a une erreur. Alors, ma question est: comment résoudre cette erreur?
DT[order(-x)]
n’est pas une déclaration équivalente àsetorder(DT, -x)
parce qu’ellesetorder()
agit en faitDT
alors que l’autre n’agit pas. Les déclarations équivalentes seraient DT <- DT [ordre (-x)] setorder (DT, -x) Je suis très nouveau dans R donc veuillez corriger si je me trompe.Réponses:
Mettre à jour
data.table v1.9.6 + prend désormais en charge la tentative initiale d'OP et la réponse suivante n'est plus nécessaire.
Vous pouvez utiliser
DT[order(-rank(x), y)]
.la source
Vous ne pouvez utiliser que
-
les entrées numériques, vous pouvez donc utiliser décroissant et annuler celles que vous voulez dans l'ordre croissant:la source
character
colonnes et que vous vouliez trier l'une croissante et l'autre décroissante.DT[order(x,-rank(w),decreasing=TRUE)]
étant donné quex
etw
sont tous les deux des colonnes de caractères. Je vous remercie!DT[order(-x)]
fonctionne comme prévu. J'ai la version 1.9.4 de data.table. Peut-être que cela a été corrigé dans une version récente.Aussi, je suggère la
setorder(DT, -x)
syntaxe en accord avec les commandes set * commesetnames
,setkey
la source