Le tue scelte
order
a partire dal base
arrange
a partire dal dplyr
setorder
e setorderv
dadata.table
arrange
a partire dal plyr
sort
a partire dal taRifx
orderBy
a partire dal doBy
sortData
a partire dal Deducer
Il più delle volte è necessario utilizzare le soluzioni dplyr
o data.table
, a meno che non sia importante non avere dipendenze, nel qual caso utilizzare base::order
.
Di recente ho aggiunto sort.data.frame a un pacchetto CRAN, rendendolo compatibile con la classe come discusso qui: Il
modo migliore per creare coerenza generica / di metodo per sort.data.frame?
Pertanto, dato il data.frame dd, è possibile ordinare come segue:
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 )
Se sei uno degli autori originali di questa funzione, ti prego di contattarmi. La discussione sul dominio pubblico è qui: http://chat.stackoverflow.com/transcript/message/1094290#1094290
Puoi anche usare la arrange()
funzione plyr
come indicato da Hadley nel thread sopra:
library(plyr)
arrange(dd,desc(z),b)
Benchmark: nota che ho caricato ciascun pacchetto in una nuova sessione R poiché c'erano molti conflitti. In particolare, il caricamento del pacchetto doBy provoca la sort
restituzione di "I seguenti oggetti sono mascherati da 'x (posizione 17)': b, x, y, z" e il caricamento del pacchetto Deducer sovrascrive sort.data.frame
da Kevin Wright o dal pacchetto 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
)
Tempi mediani:
dd[with(dd, order(-z, b)), ]
778
dd[order(-dd$z, dd$b),]
788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
Tempo medio: 1.567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
Tempo medio: 862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
Tempo medio: 1.694
Nota che doBy impiega un bel po 'di tempo per caricare il pacchetto.
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
Impossibile caricare Deducer. Necessita 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)
Non sembra essere compatibile con il microbenchmark a causa dell'attacco / distacco.
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))
(le linee si estendono dal quartile inferiore al quartile superiore, il punto è la mediana)
Dati questi risultati e soppesando la semplicità rispetto alla velocità, dovrei dare un cenno arrange
nel plyr
pacchetto . Ha una sintassi semplice e tuttavia è quasi veloce come la R base comanda con le loro macchinazioni contorte. Lavoro tipicamente geniale di Hadley Wickham. La mia unica lamentela è che rompe la nomenclatura R standard da cui vengono richiamati gli oggetti di ordinamento sort(object)
, ma capisco perché Hadley lo abbia fatto in questo modo a causa di problemi discussi nella domanda sopra collegata.