Suas escolhas
order de base
arrange de dplyr
setordere setordervdedata.table
arrange de plyr
sort de taRifx
orderBy de doBy
sortData de Deducer
Na maioria das vezes, você deve usar as soluções dplyrou data.table, a menos que não seja necessário ter nenhuma dependência, nesse caso, use base::order.
Recentemente, adicionei sort.data.frame a um pacote CRAN, tornando-o compatível com a classe, conforme discutido aqui:
Melhor maneira de criar consistência genérica / método para sort.data.frame?
Portanto, dado o data.frame dd, você pode classificar da seguinte maneira:
dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"),
levels = c("Low", "Med", "Hi"), ordered = TRUE),
x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
z = c(1, 1, 1, 2))
library(taRifx)
sort(dd, f= ~ -z + b )
Se você é um dos autores originais desta função, entre em contato comigo. A discussão sobre domínio público está aqui: http://chat.stackoverflow.com/transcript/message/1094290#1094290
Você também pode usar a arrange()função plyrcomo Hadley apontou no tópico acima:
library(plyr)
arrange(dd,desc(z),b)
Benchmarks: Observe que eu carreguei cada pacote em uma nova sessão R, pois havia muitos conflitos. Em particular, o carregamento do pacote doBy faz sortcom que retorne "O (s) objeto (s) a seguir estão mascarados de 'x (posição 17)': b, x, y, z" e o carregamento das substituições sort.data.framedo pacote do Dedutor de Kevin Wright ou do pacote taRifx.
#Load each time
dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"),
levels = c("Low", "Med", "Hi"), ordered = TRUE),
x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
z = c(1, 1, 1, 2))
library(microbenchmark)
# Reload R between benchmarks
microbenchmark(dd[with(dd, order(-z, b)), ] ,
dd[order(-dd$z, dd$b),],
times=1000
)
Tempos medianos:
dd[with(dd, order(-z, b)), ] 778
dd[order(-dd$z, dd$b),] 788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
Tempo médio: 1,567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
Tempo médio: 862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
Tempo médio: 1.694
Observe que o doBy leva um bom tempo para carregar o pacote.
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
Não foi possível carregar o Dedutor. Precisa do console JGR.
esort <- function(x, sortvar, ...) {
attach(x)
x <- x[with(x,order(sortvar,...)),]
return(x)
detach(x)
}
microbenchmark(esort(dd, -z, b),times=1000)
Não parece ser compatível com a marca de microbench devido à conexão / remoção.
m <- microbenchmark(
arrange(dd,desc(z),b),
sort(dd, f= ~-z+b ),
dd[with(dd, order(-z, b)), ] ,
dd[order(-dd$z, dd$b),],
times=1000
)
uq <- function(x) { fivenum(x)[4]}
lq <- function(x) { fivenum(x)[2]}
y_min <- 0 # min(by(m$time,m$expr,lq))
y_max <- max(by(m$time,m$expr,uq)) * 1.05
p <- ggplot(m,aes(x=expr,y=time)) + coord_cartesian(ylim = c( y_min , y_max ))
p + stat_summary(fun.y=median,fun.ymin = lq, fun.ymax = uq, aes(fill=expr))

(as linhas se estendem do quartil inferior ao quartil superior, ponto é a mediana)
Dados esses resultados e pesando simplicidade versus velocidade, eu teria que concordar com arrangeo plyrpacote . Ele tem uma sintaxe simples e, no entanto, é quase tão rápido quanto o R básico comanda com suas maquinações complicadas. Um trabalho tipicamente brilhante de Hadley Wickham. Minha única preocupação é que ele quebra a nomenclatura R padrão pela qual os objetos de classificação são chamados sort(object), mas eu entendo por que Hadley fez dessa maneira devido a questões discutidas na pergunta acima.