Sortuj wiersze w danych.tabela w kolejności malejącej na klawiszu łańcuchowym 'order (- x, v`' podaje błąd w danych.tabela 1.9.4 lub wcześniejsza

Powiedzmy, że mam następujące data.table w R:

  library(data.table)
  DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)

Chcę zamówić go przez dwie kolumny (powiedzmy kolumny x i v). Użyłem tego:

 DT[order(x,v)] # sorts first by x then by v (both in ascending order)

Ale teraz chcę go posortować według x (w kolejności malejącej) i mieć następujący kod:

  DT[order(-x)] #Error in -x : invalid argument to unary operator

Dlatego myślę, że ten błąd wynika z faktu, że class(DT$x)=character. Czy mógłby mi pan zasugerować rozwiązanie tego problemu?

Wiem, że mogę użyć DT[order(x,decreasing=TRUE)], ale chcę znać składnię, aby sortować po kilku kolumny w obie strony (niektóre malejące, niektóre rosnące) w tym samym czasie.

Zwróć uwagę, że jeśli użyjesz DT[order(-y,v)] wynik jest ok, ale jeśli użyjesz DT[order(-x,v)] wystąpi błąd. Więc moje pytanie brzmi: jak rozwiązać ten błąd?

Author: smci, 2012-09-10

3 answers

Update

Data.Tabela v1.9.6 + obsługuje teraz oryginalną próbę OP i następująca odpowiedź nie jest już potrzebna.


Możesz użyć 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
 121
Author: Matthew Plourde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-23 15:44:30

Możesz używać tylko - na numerycznych wpisach, więc możesz używać malejących i negować te, które chcesz w kolejności rosnącej:

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
 20
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 15:00:39

DT[order(-x)] działa zgodnie z oczekiwaniami. Mam dane.tabela w wersji 1.9.4. Może to zostało naprawione w najnowszej wersji.
Sugeruję również składnię setorder(DT, -x) zgodną z poleceniami set* jak setnames, setkey

 12
Author: Pankil Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 03:44:20