Powiedzmy, że mam następujący 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ę uporządkować według dwóch kolumn (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ę to posortować x
(w porządku malejącym) i mam następujący kod:
DT[order(-x)] #Error in -x : invalid argument to unary operator
Dlatego myślę, że ten błąd wynika z tego class(DT$x)=character
. Czy możesz podać mi jakąś sugestię, jak rozwiązać ten problem?
Wiem, że mogę używać DT[order(x,decreasing=TRUE)]
, ale chcę znać składnię do sortowania według kilku kolumn przy użyciu obu sposobów (niektóre malejące, niektóre zwiększające) w tym samym czasie.
Zauważ, że jeśli używasz, DT[order(-y,v)]
wynik jest w porządku, ale jeśli używasz DT[order(-x,v)]
, jest błąd. Więc moje pytanie brzmi: jak rozwiązać ten błąd?
DT[order(-x)]
nie jest to równoważne stwierdzeniu,setorder(DT, -x)
ponieważsetorder()
faktycznie działa,DT
podczas gdy inne nie. Równoważne stwierdzenia to DT <- DT [order (-x)] setorder (DT, -x) Jestem bardzo nowy w R, więc proszę poprawić, jeśli się mylę.Odpowiedzi:
Aktualizacja
data.table v1.9.6 + obsługuje teraz oryginalną próbę OP, a następująca odpowiedź nie jest już potrzebna.
Możesz użyć
DT[order(-rank(x), y)]
.źródło
Możesz używać tylko
-
dla wpisów numerycznych, więc możesz zmniejszać i zanegować te, które chcesz, w kolejności rosnącej:źródło
character
kolumny i chcesz posortować jedną rosnącą, a drugą malejącą.DT[order(x,-rank(w),decreasing=TRUE)]
skorox
iw
są obie kolumny znaków. Dziękuję Ci!DT[order(-x)]
działa zgodnie z oczekiwaniami. Mam data.table w wersji 1.9.4. Może zostało to naprawione w najnowszej wersji.Sugeruję również
setorder(DT, -x)
składnię zgodną z poleceniami set * , takimi jaksetnames
,setkey
źródło