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?
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
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
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
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