Tus opciones
order
desde base
arrange
desde dplyr
setorder
y setorderv
dedata.table
arrange
desde plyr
sort
desde taRifx
orderBy
desde doBy
sortData
desde Deducer
La mayoría de las veces debe usar las soluciones dplyr
o 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 plyr
como 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 sort
devuelve "Los siguientes objetos se enmascaran desde 'x (posición 17)': b, x, y, z", y al cargar el paquete Deducer se sobrescribe sort.data.frame
de 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 arrange
la plyr
paquete . 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.