您的选择
-
order
从 base
-
arrange
从 dplyr
-
setorder
以及 setorderv
来自 data.table
-
arrange
从 plyr
-
sort
从 taRifx
-
orderBy
从 doBy
-
sortData
从 Deducer
大多数情况下,你应该使用 dplyr
或 data.table
解决方案,除非没有依赖关系很重要,在这种情况下使用 base::order
.
我最近将 sort.data.frame 添加到了 CRAN 包中,使其与这里讨论的类兼容: 为 sort.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..com/transcript/message/1094290#1094290
您还可以使用 arrange()
Hadley 在上面的线程中指出的 plyr
功能
library(plyr)
arrange(dd,desc(z),b)
基准测试:请注意,由于存在许多冲突,我将每个包都加载到新的 R 会话中。特别是,加载 doBy 包会导致 sort
返回“以下对象被‘x(位置 17)’屏蔽:b、x、y、z”,而加载 Deducer 包会覆盖 sort.data.frame
Kevin Wright 或 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
)
中位时间:
dd[with(dd, order(-z, b)), ]
778
dd[order(-dd$z, dd$b),]
788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
中位时间: 1,567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
中位时间: 862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
中位时间: 1,694
请注意,doBy 需要花费相当多的时间来加载包。
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
无法加载 Deducer。需要 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))
(线从下四分位数延伸到上四分位数,点是中位数)
鉴于这些结果,并在简单性和速度之间进行权衡,我不得不同意 arrange
in the plyr
package 。它的语法简单,但速度却几乎与基本 R 命令及其复杂的机制一样快。典型的 Hadley Wickham 作品。我唯一不满意的是,它打破了标准 R 命名法,其中排序对象由 调用 sort(object)
,但我理解 Hadley 这样做的原因,因为上面链接的问题中讨论了这些问题。