Digamos que eu tenho o seguinte data.table
em R
:
library(data.table)
DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
Quero ordená-lo por duas colunas (digamos colunas x
e v
). Eu usei isso:
DT[order(x,v)] # sorts first by x then by v (both in ascending order)
Mas agora, quero classificá-lo por x
(em ordem decrescente) e ter o seguinte código:
DT[order(-x)] #Error in -x : invalid argument to unary operator
Portanto, acho que esse erro se deve ao fato de que class(DT$x)=character
. Você poderia me dar alguma sugestão para resolver esse problema?
Sei que posso usar DT[order(x,decreasing=TRUE)]
, mas quero conhecer a sintaxe para classificar por várias colunas usando os dois modos (alguns diminuindo, outros aumentando) ao mesmo tempo.
Observe que se você usar DT[order(-y,v)]
o resultado está ok, mas se você usar, DT[order(-x,v)]
há um erro. Então, minha pergunta é: como resolver esse erro?
DT[order(-x)]
não é uma afirmação equivalente a,setorder(DT, -x)
porquesetorder()
na verdade ageDT
enquanto o outro não. Declarações equivalentes seriam DT <- DT [ordem (-x)] setorder (DT, -x) Eu sou muito novo em R, então corrija se estiver enganado.Respostas:
Atualizar
O data.table v1.9.6 + agora suporta a tentativa original do OP e a resposta a seguir não é mais necessária.
Você pode usar
DT[order(-rank(x), y)]
.fonte
Você pode usar apenas
-
as entradas numéricas, para diminuir e negar as que deseja em ordem crescente:fonte
character
colunas e queira classificar uma aumentando e a outra diminuindo.DT[order(x,-rank(w),decreasing=TRUE)]
dado issox
ew
são as duas colunas de caracteres. Obrigado!DT[order(-x)]
funciona como esperado. Tenho data.table versão 1.9.4. Talvez isso tenha sido corrigido em uma versão recente.Além disso, sugiro a
setorder(DT, -x)
sintaxe de acordo com os comandos set *setnames
, comosetkey
fonte