148 votes

Trier les lignes de data.table par ordre décroissant sur la clé `order(-x,v)` donne une erreur sur data.table 1.9.4 ou antérieur

Disons que j'ai les éléments suivants data.table en 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 l'ordonner par deux colonnes (disons des colonnes x y 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 ont 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 une suggestion afin de résoudre ce problème ?

Je sais que je peux utiliser DT[order(x,decreasing=TRUE)] mais je voudrais connaître la syntaxe pour trier sur 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 correct, mais si vous utilisez DT[order(-x,v)] il y a une erreur. Ma question est donc la suivante : comment résoudre cette erreur ?

166voto

Matthew Plourde Points 18649

Mise à jour

table.de.données La v1.9.6+ supporte maintenant la tentative originale de l'OP et la réponse suivante n'est plus nécessaire.


Vous pouvez utiliser DT[order(-rank(x), y)] .

   x y v
1: c 1 7
2: c 3 8
3: c 6 9
4: b 1 1
5: b 3 2
6: b 6 3
7: a 1 4
8: a 3 5
9: a 6 6

27voto

James Points 24725

Vous pouvez uniquement utiliser - sur les entrées numériques, de sorte que vous pouvez utiliser la décroissance et la négation de celles que vous voulez dans l'ordre croissant :

DT[order(x,-v,decreasing=TRUE),]
      x y v
 [1,] c 1 7
 [2,] c 3 8
 [3,] c 6 9
 [4,] b 1 1
 [5,] b 3 2
 [6,] b 6 3
 [7,] a 1 4
 [8,] a 3 5
 [9,] a 6 6

25voto

Pankil Shah Points 850

DT[order(-x)] fonctionne comme prévu. J'ai la version 1.9.4 de data.table. Peut-être ce problème a-t-il été corrigé dans une version récente.
Aussi, je suggère le setorder(DT, -x) syntaxe conforme à la set* des commandes comme setnames , setkey

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X