Vos choix
order
de base
arrange
de dplyr
setorder
et setorderv
dedata.table
arrange
de plyr
sort
de taRifx
orderBy
de doBy
sortData
de Deducer
La plupart du temps, vous devez utiliser les solutions dplyr
or 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 plyr
comme 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 sort
le retour "Les objets suivants sont masqués de" x (position 17) ": b, x, y, z", et le chargement du package Deducer remplace sort.data.frame
Kevin 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 à arrange
l' plyr
emballage . 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.