Lựa chọn của bạn
order
từ base
arrange
từ dplyr
setorder
và setorderv
từdata.table
arrange
từ plyr
sort
từ taRifx
orderBy
từ doBy
sortData
từ Deducer
Hầu hết thời gian bạn nên sử dụng dplyr
hoặc data.table
giải pháp, trừ khi không có phụ thuộc là quan trọng, trong trường hợp sử dụng base::order
.
Gần đây tôi đã thêm sort.data.frame vào gói CRAN, làm cho lớp này tương thích như được thảo luận ở đây:
Cách tốt nhất để tạo tính nhất quán chung / phương thức cho sort.data.frame?
Do đó, với dd data.frame, bạn có thể sắp xếp như sau:
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 )
Nếu bạn là một trong những tác giả gốc của chức năng này, xin vui lòng liên hệ với tôi. Thảo luận về phạm vi công cộng có tại đây: http://chat.stackoverflow.com/transcript/message/1094290#1094290
Bạn cũng có thể sử dụng arrange()
hàm từ plyr
như Hadley đã chỉ ra trong chuỗi trên:
library(plyr)
arrange(dd,desc(z),b)
Điểm chuẩn: Lưu ý rằng tôi đã tải từng gói trong phiên R mới vì có rất nhiều xung đột. Cụ thể là tải gói doBy gây ra sort
trả về "Các đối tượng sau được che dấu từ 'x (vị trí 17)': b, x, y, z" và tải gói Deducer ghi đè sort.data.frame
từ Kevin Wright hoặc gói 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
)
Thời gian trung bình:
dd[with(dd, order(-z, b)), ]
778
dd[order(-dd$z, dd$b),]
788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
Thời gian trung bình: 1.567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
Thời gian trung bình: 862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
Thời gian trung bình: 1.694
Lưu ý rằng doBy mất một chút thời gian để tải gói.
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
Không thể tải Deducer. Cần giao diện điều khiển JGR.
esort <- function(x, sortvar, ...) {
attach(x)
x <- x[with(x,order(sortvar,...)),]
return(x)
detach(x)
}
microbenchmark(esort(dd, -z, b),times=1000)
Không có vẻ tương thích với microbenchmark do đính kèm / tách.
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))
(các dòng kéo dài từ phân vị thấp hơn đến phân vị trên, dấu chấm là trung vị)
Với những kết quả và nặng tốc độ so với sự đơn giản, tôi muốn phải từ bỏ cái gật đầu để arrange
trong plyr
gói . Nó có một cú pháp đơn giản và gần như nhanh như các lệnh R cơ sở với các âm mưu phức tạp của chúng. Điển hình là công việc tuyệt vời của Hadley Wickham. Điều duy nhất của tôi với nó là nó phá vỡ danh pháp R tiêu chuẩn nơi các đối tượng sắp xếp được gọi theo sort(object)
, nhưng tôi hiểu tại sao Hadley lại làm như vậy do các vấn đề được thảo luận trong câu hỏi liên kết ở trên.