Vos choix
order de base
arrange de dplyr
setorderet setordervdedata.table
arrange de plyr
sort de taRifx
orderBy de doBy
sortData de Deducer
La plupart du temps, vous devez utiliser les solutions dplyror data.table, sauf s'il est important de ne pas avoir de dépendances, auquel cas utilisez-les base::order.
J'ai récemment ajouté sort.data.frame à un package CRAN, ce qui le rend compatible avec les classes comme discuté ici: Le
meilleur moyen de créer une cohérence générique / méthode pour sort.data.frame?
Par conséquent, étant donné le data.frame dd, vous pouvez trier comme suit:
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 )
Si vous êtes l'un des auteurs originaux de cette fonction, veuillez me contacter. La discussion sur le domaine public est ici: http://chat.stackoverflow.com/transcript/message/1094290#1094290
Vous pouvez également utiliser la arrange()fonction de plyrcomme Hadley l'a souligné dans le fil ci-dessus:
library(plyr)
arrange(dd,desc(z),b)
Benchmarks: Notez que j'ai chargé chaque paquet dans une nouvelle session R car il y avait beaucoup de conflits. En particulier, le chargement du package doBy provoque sortle retour "Les objets suivants sont masqués de" x (position 17) ": b, x, y, z", et le chargement du package Deducer remplace sort.data.frameKevin Wright ou le package 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
)
Temps médians:
dd[with(dd, order(-z, b)), ] 778
dd[order(-dd$z, dd$b),] 788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
Temps médian: 1567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
Temps médian: 862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
Temps médian: 1694
Notez que doBy prend un peu de temps pour charger le package.
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
Impossible de charger le déducteur. Nécessite une 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)
Ne semble pas être compatible avec la référence microbienne en raison de l'attachement / détachement.
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))

(les lignes s'étendent du quartile inférieur au quartile supérieur, le point est la médiane)
Compte tenu de ces résultats et de la simplicité de pesée par rapport à la vitesse, je devrais donner le feu vert à arrangel' plyremballage . Il a une syntaxe simple et pourtant est presque aussi rapide que les commandes de base R avec leurs machinations alambiquées. Travail Hadley Wickham typiquement brillant. Mon seul reproche, c'est qu'il brise la nomenclature R standard où les objets de tri sont appelés sort(object), mais je comprends pourquoi Hadley l'a fait de cette façon en raison des problèmes discutés dans la question liée ci-dessus.