Tus opciones
order desde base
arrange desde dplyr
setordery setordervdedata.table
arrange desde plyr
sort desde taRifx
orderBy desde doBy
sortData desde Deducer
La mayoría de las veces debe usar las soluciones dplyro data.table, a menos que sea importante no tener dependencias, en cuyo caso use base::order.
Recientemente agregué sort.data.frame a un paquete CRAN, haciéndolo compatible con la clase como se explica aquí: ¿La
mejor manera de crear consistencia genérica / de método para sort.data.frame?
Por lo tanto, dado el data.frame dd, puede ordenar de la siguiente manera:
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 )
Si usted es uno de los autores originales de esta función, contácteme. La discusión sobre dominio público está aquí: http://chat.stackoverflow.com/transcript/message/1094290#1094290
También puede usar la arrange()función plyrcomo señaló Hadley en el hilo anterior:
library(plyr)
arrange(dd,desc(z),b)
Puntos de referencia: tenga en cuenta que cargué cada paquete en una nueva sesión de R ya que hubo muchos conflictos. En particular, al cargar el paquete doBy se sortdevuelve "Los siguientes objetos se enmascaran desde 'x (posición 17)': b, x, y, z", y al cargar el paquete Deducer se sobrescribe sort.data.framede Kevin Wright o del paquete 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
)
Tiempos medianos:
dd[with(dd, order(-z, b)), ] 778
dd[order(-dd$z, dd$b),] 788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
Tiempo medio: 1,567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
Tiempo medio: 862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
Tiempo medio: 1,694
Tenga en cuenta que doBy tarda bastante tiempo en cargar el paquete.
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
No se pudo hacer que la carga del deductor. Necesita consola JGR.
esort <- function(x, sortvar, ...) {
attach(x)
x <- x[with(x,order(sortvar,...)),]
return(x)
detach(x)
}
microbenchmark(esort(dd, -z, b),times=1000)
No parece ser compatible con microbenchmark debido a la conexión / desconexión.
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))

(las líneas se extienden desde el cuartil inferior al cuartil superior, el punto es la mediana)
Teniendo en cuenta estos resultados y un peso de velocidad frente a la simplicidad, que tendría que dar el visto bueno a arrangela plyrpaquete . Tiene una sintaxis simple y, sin embargo, es casi tan rápida como los comandos base R con sus complicadas maquinaciones. Típicamente brillante trabajo de Hadley Wickham. Mi única queja es que rompe la nomenclatura R estándar por la que se llama a los objetos de clasificación sort(object), pero entiendo por qué Hadley lo hizo de esa manera debido a los problemas discutidos en la pregunta vinculada anteriormente.