Deine Entscheidungen
order von base
arrange von dplyr
setorderund setordervvondata.table
arrange von plyr
sort von taRifx
orderBy von doBy
sortData von Deducer
In den meisten Fällen sollten Sie die dplyroder data.table-Lösungen verwenden, es sei denn, es ist wichtig, keine Abhängigkeiten zu haben. In diesem Fall sollten Sie sie verwenden base::order.
Ich habe kürzlich sort.data.frame zu einem CRAN-Paket hinzugefügt, um es klassenkompatibel zu machen, wie hier beschrieben:
Beste Methode zum Erstellen einer generischen / Methodenkonsistenz für sort.data.frame?
Daher können Sie angesichts des 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 über Public Domaininess finden Sie hier: http://chat.stackoverflow.com/transcript/message/1094290#1094290
Sie können auch die arrange()Funktion von verwenden, plyrwie Hadley im obigen Thread ausgeführt hat:
library(plyr)
arrange(dd,desc(z),b)
Benchmarks: Beachten Sie, dass ich jedes Paket in eine neue R-Sitzung geladen habe, da es viele Konflikte gab. Insbesondere das Laden des doBy-Pakets führt sortdazu, dass "Die folgenden Objekte werden von 'x (Position 17)' maskiert: b, x, y, z" zurückgegeben wird und das Laden des Deducer-Pakets sort.data.framevon Kevin Wright oder dem taRifx-Paket überschrieben wird .
#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
)
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 einige Zeit zum Laden des Pakets benötigt.
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
Deducer konnte nicht geladen werden. Benötigt 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 des Anbringens / Entfernens nicht mit Microbenchmark kompatibel 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))

(Linien erstrecken sich vom unteren zum oberen Quartil, Punkt ist der Median)
Angesichts dieser Ergebnisse und der Abwägung von Einfachheit und Geschwindigkeit müsste ich arrangedem plyrPaket zustimmen . Es hat eine einfache Syntax und ist dennoch fast so schnell wie die Basis-R-Befehle mit ihren verschlungenen Machenschaften. Typisch brillante Hadley Wickham Arbeit. Mein einziger Kritikpunkt ist, dass es die Standard-R-Nomenklatur bricht, nach der Sortierobjekte aufgerufen werden sort(object), aber ich verstehe, warum Hadley dies aufgrund von Problemen getan hat, die in der oben verlinkten Frage erörtert wurden.