Ihre Auswahl
order
von base
arrange
von dplyr
setorder
und setorderv
von data.table
arrange
von plyr
sort
von taRifx
orderBy
von doBy
sortData
von Deducer
Meistens sollten Sie die Lösungen von dplyr
oder data.table
verwenden, es sei denn, dass keine Abhängigkeiten wichtig sind, in diesem Fall verwenden Sie base::order
.
Ich habe kürzlich sort.data.frame zu einem CRAN-Paket hinzugefügt, um es kompatibel zu machen, wie hier diskutiert wurde: Bester Weg, um allgemeine/methodische Konsistenz für sort.data.frame zu erstellen?
Daher können Sie für das data.frame dd wie folgt sortieren:
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 )
Wenn Sie einer der ursprünglichen Autoren dieser Funktion sind, kontaktieren Sie mich bitte. Die Diskussion zur Public Domain Init ist hier: https://chat.stackoverflow.com/transcript/message/1094290#1094290
Sie können auch die Funktion arrange()
von plyr
verwenden, wie Hadley in obigem Thread erwähnt hat:
library(plyr)
arrange(dd,desc(z),b)
Benchmarks: Beachten Sie, dass ich jedes Paket in einer neuen R-Sitzung geladen habe, da es viele Konflikte gab. Insbesondere führt das Laden des doBy-Pakets dazu, dass sort
"Die folgenden Objekte sind von 'x (Position 17)' verdeckt: b, x, y, z" zurückgibt, und das Laden des Deducer-Pakets überschreibt sort.data.frame
von Kevin Wright oder das taRifx-Paket.
#Jedes Mal laden
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)
# R zwischen Benchmarks neu laden
microbenchmark(dd[with(dd, order(-z, b)), ] ,
dd[order(-dd$z, dd$b),],
times=1000
)
Medianzeiten:
dd[with(dd, order(-z, b)), ]
778
dd[order(-dd$z, dd$b),]
788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
Medianzeit: 1.567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
Medianzeit: 862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
Medianzeit: 1.694
Beachten Sie, dass doBy viel Zeit benötigt, um das Paket zu laden.
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
Konnte Deducer nicht laden. Erfordert JGR-Konsole.
esort <- function(x, sortvar, ...) {
attach(x)
x <- x[with(x,order(sortvar,...)),]
return(x)
detach(x)
}
microbenchmark(esort(dd, -z, b),times=1000)
Scheint aufgrund von attach/detach nicht kompatibel mit microbenchmark zu sein.
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))
(Die Linien reichen vom unteren Quartil bis zum oberen Quartil, der Punkt ist der Median)
Anhand dieser Ergebnisse und der Abwägung von Einfachheit gegen Geschwindigkeit muss ich arrange
im plyr
-Paket den Vorzug geben. Es hat eine einfache Syntax und ist fast so schnell wie die Basis-R-Befehle mit ihren komplizierten Machenschaften. Typische brillante Arbeit von Hadley Wickham. Mein einziger Kritikpunkt ist, dass es mit der Standard-R-Nomenklatur bricht, in der Sortierobjekte mit sort(object)
aufgerufen werden, aber ich verstehe, warum Hadley es auf diese Weise gemacht hat, aufgrund der diskutierten Probleme in der oben verlinkten Frage.