ทางเลือกของคุณ
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?
ดังนั้นให้ 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 )
หากคุณเป็นหนึ่งในผู้เขียนดั้งเดิมของฟังก์ชันนี้โปรดติดต่อฉัน การสนทนาเกี่ยวกับความเป็นสาธารณะอยู่ที่นี่: http://chat.stackoverflow.com/transcript/message/1094290#1094290
นอกจากนี้คุณยังสามารถใช้arrange()
ฟังก์ชั่นจากplyr
ที่ Hadley ชี้ให้เห็นในหัวข้อด้านบน:
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)
ดูเหมือนจะไม่เข้ากันได้กับ microbenchmark เนื่องจากการแนบ / แยก
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
ในplyr
แพคเกจ มันมีไวยากรณ์ที่เรียบง่าย แต่ก็เกือบจะเร็วเหมือนคำสั่งพื้นฐาน R พร้อมการตัดเฉือนที่ซับซ้อน โดยทั่วไปแล้ว Hadley Wickham จะทำงานได้อย่างยอดเยี่ยม สิ่งเดียวที่ฉันจับได้คือมันทำลายระบบการตั้งชื่อมาตรฐานที่เรียกใช้การเรียงลำดับวัตถุsort(object)
แต่ฉันเข้าใจว่าทำไม Hadley ทำแบบนั้นเนื่องจากปัญหาที่กล่าวถึงในคำถามที่เชื่อมโยงข้างต้น