Deine Entscheidungen
order
von base
arrange
von dplyr
setorder
und setorderv
vondata.table
arrange
von plyr
sort
von taRifx
orderBy
von doBy
sortData
von Deducer
In den meisten Fällen sollten Sie die dplyr
oder 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, plyr
wie 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 sort
dazu, 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.frame
von 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 arrange
dem plyr
Paket 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.