Suas escolhas
order
de base
arrange
de dplyr
setorder
e setorderv
dedata.table
arrange
de plyr
sort
de taRifx
orderBy
de doBy
sortData
de Deducer
Na maioria das vezes, você deve usar as soluções dplyr
ou 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 plyr
como 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 sort
com 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.frame
do 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 arrange
o plyr
pacote . 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.