Pilihan anda
order
dari base
arrange
dari dplyr
setorder
dan setorderv
daridata.table
arrange
dari plyr
sort
dari taRifx
orderBy
dari doBy
sortData
dari Deducer
Sebagian besar waktu Anda harus menggunakan dplyr
atau data.table
solusi, kecuali tidak memiliki ketergantungan adalah penting, dalam hal ini digunakan base::order
.
Saya baru-baru ini menambahkan sort.data.frame ke paket CRAN, menjadikannya kompatibel dengan kelas seperti yang dibahas di sini:
Cara terbaik untuk membuat konsistensi generik / metode untuk sort.data.frame?
Oleh karena itu, mengingat data.frame dd, Anda dapat mengurutkan sebagai berikut:
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 )
Jika Anda adalah salah satu penulis asli dari fungsi ini, silakan hubungi saya. Diskusi mengenai domain publik ada di sini: http://chat.stackoverflow.com/transcript/message/1094290#1094290
Anda juga dapat menggunakan arrange()
fungsi dari plyr
seperti yang Hadley tunjukkan di utas di atas:
library(plyr)
arrange(dd,desc(z),b)
Benchmark: Perhatikan bahwa saya memuat setiap paket dalam sesi R baru karena ada banyak konflik. Khususnya memuat paket doBy yang menyebabkan sort
pengembalian "Objek berikut ini disembunyikan dari 'x (posisi 17)': b, x, y, z", dan memuat paket Deducer menimpa sort.data.frame
dari Kevin Wright atau paket 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
)
Waktu rata-rata:
dd[with(dd, order(-z, b)), ]
778
dd[order(-dd$z, dd$b),]
788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
Waktu rata-rata: 1,567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
Waktu rata-rata: 862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
Waktu rata-rata: 1,694
Perhatikan bahwa doBy membutuhkan sedikit waktu untuk memuat paket.
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
Tidak dapat membuat Deducer memuat. Membutuhkan konsol JGR.
esort <- function(x, sortvar, ...) {
attach(x)
x <- x[with(x,order(sortvar,...)),]
return(x)
detach(x)
}
microbenchmark(esort(dd, -z, b),times=1000)
Tampaknya tidak kompatibel dengan microbenchmark karena melampirkan / melepaskan.
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))
(garis memanjang dari kuartil bawah ke kuartil atas, titik adalah median)
Mengingat hasil ini dan menimbang kesederhanaan vs kecepatan, saya harus memberi anggukan arrange
pada plyr
paket . Ia memiliki sintaksis yang sederhana namun hampir sama cepatnya dengan perintah R dasar dengan intrik yang berbelit-belit. Pekerjaan Hadley Wickham yang biasanya brilian. Satu-satunya keluhan saya dengan itu adalah bahwa itu melanggar nomenklatur R standar di mana objek penyortiran dipanggil sort(object)
, tapi saya mengerti mengapa Hadley melakukannya seperti itu karena masalah yang dibahas dalam pertanyaan yang terkait di atas.