Twoje wybory
order
od base
arrange
od dplyr
setorder
i setorderv
oddata.table
arrange
od plyr
sort
od taRifx
orderBy
od doBy
sortData
od Deducer
Przez większość czasu powinieneś korzystać z rozwiązań dplyr
lub data.table
, chyba że ważne jest posiadanie niezależności, w takim przypadku użyj base::order
.
Niedawno dodałem sort.data.frame do pakietu CRAN, dzięki czemu jest on zgodny z klasą, jak omówiono tutaj:
Najlepszy sposób tworzenia spójności ogólnej / metody dla sort.data.frame?
Dlatego biorąc pod uwagę data.frame dd, możesz sortować w następujący sposób:
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 )
Jeśli jesteś jednym z oryginalnych autorów tej funkcji, skontaktuj się ze mną. Dyskusja na temat domeny publicznej jest tutaj: http://chat.stackoverflow.com/transcript/message/1094290#1094290
Możesz także użyć arrange()
funkcji z, plyr
jak wskazał Hadley w powyższym wątku:
library(plyr)
arrange(dd,desc(z),b)
Benchmarki: Zauważ, że załadowałem każdy pakiet w nowej sesji R, ponieważ było wiele konfliktów. W szczególności ładowanie pakietu doBy powoduje sort
zwrócenie „Następujące obiekty są maskowane z„ x (pozycja 17) ”: b, x, y, z”, a ładowanie pakietu Deducer zastępuje sort.data.frame
Kevin Wright lub pakiet 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
)
Mediana razy:
dd[with(dd, order(-z, b)), ]
778
dd[order(-dd$z, dd$b),]
788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
Mediana czasu: 1567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
Mediana czasu: 862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
Mediana czasu: 1,694
Pamiętaj, że doBy zajmuje dużo czasu, aby załadować pakiet.
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
Nie można zmusić Deducer do obciążenia. Potrzebuje konsoli JGR.
esort <- function(x, sortvar, ...) {
attach(x)
x <- x[with(x,order(sortvar,...)),]
return(x)
detach(x)
}
microbenchmark(esort(dd, -z, b),times=1000)
Wygląda na to, że nie jest kompatybilny z mikrodrukiem ze względu na dołączanie / odłączanie.
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))
(linie rozciągają się od dolnego kwartylu do górnego kwartylu, kropka jest medianą)
Biorąc pod uwagę te wyniki i ważenie prostoty w porównaniu z szybkością, musiałbym skinąć głową arrange
w plyr
pakiecie . Ma prostą składnię, a mimo to jest prawie tak szybki, jak komendy podstawowego R z ich skomplikowanymi machinacjami. Zazwyczaj genialna praca Hadleya Wickhama. Jedyną moją wadą jest to, że łamie standardową nomenklaturę R, w której wywoływane są obiekty sortujące sort(object)
, ale rozumiem, dlaczego Hadley zrobił to w ten sposób z powodu problemów omówionych w pytaniu powiązanym powyżej.