您的选择
从基础订购从dplyr安排data.table中的setorder和setorderv从plyer安排从taRifx排序orderBy来自doBy从推断器中排序数据
大多数时候,您应该使用dplyr或data.table解决方案,除非没有依赖关系很重要,在这种情况下使用base::order。
我最近将sort.data.frame添加到CRAN包中,使其类兼容,如下所述:为sort.data.frame创建通用/方法一致性的最佳方法?
因此,给定data.frame dd,可以按如下方式排序:
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 )
如果您是该函数的原始作者之一,请与我联系。关于公共域的讨论如下:https://chat.stackoverflow.com/transcript/message/1094290#1094290
您还可以使用plyr中的arrange()函数,正如Hadley在上面的线程中指出的那样:
library(plyr)
arrange(dd,desc(z),b)
基准测试:注意,我在一个新的R会话中加载了每个包,因为有很多冲突。特别是,加载doBy包会导致排序返回“以下对象从‘x(位置17)’屏蔽:b,x,y,z”,并且加载演绎器包会覆盖Kevin Wright或taRifx包的sort.data.frame。
#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
)
中值时间:
dd[带(dd,顺序(-z,b)),]778
dd[订单(-dd$z,dd$b),]788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
中位时间:1567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
中位时间:862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
中位时间:1694
注意,doBy需要很长时间来加载包。
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
无法使扣减器加载。需要JGR控制台。
esort <- function(x, sortvar, ...) {
attach(x)
x <- x[with(x,order(sortvar,...)),]
return(x)
detach(x)
}
microbenchmark(esort(dd, -z, b),times=1000)
由于连接/分离,似乎与微基准测试不兼容。
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))
(线从下四分位延伸到上四分位,点是中间值)
考虑到这些结果,并权衡了简单性与速度,我不得不同意在plyer包中进行安排。它有一个简单的语法,但它的速度几乎和基本的R命令一样快,而且具有复杂的机制。典型的杰出哈德利·威克姆作品。我唯一的不满是它打破了按排序(对象)调用排序对象的标准R命名法,但我理解哈德利之所以这样做,是因为上面所讨论的问题。