Ваш вибір
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?
Тому, враховуючи дані.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
як Хадлі вказав у вищенаведеній темі:
library(plyr)
arrange(dd,desc(z),b)
Орієнтири: Зауважте, що я завантажував кожен пакет у новому сеансі R, оскільки було багато конфліктів. Зокрема, завантаження пакета doBy призводить sort
до повернення "Наступні об'єкти маскуються з 'x (позиція 17)': b, x, y, z", а завантаження пакета Deducer перезаписується sort.data.frame
з Кевіна Райт або пакета 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)
Середній час: 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))
(лінії простягаються від нижнього кварталу до верхнього кватиля, точка - медіана)
Враховуючи ці результати та зважуючи простоту та швидкість, я повинен би дати кивок arrange
у plyr
пакеті . Він має простий синтаксис і все ж майже такий же швидкий, як і базові команди R зі своїми звивистими махінаціями. Типово геніальна робота Хедлі Вікхема. Моя єдина боротьба з цим полягає в тому, що він порушує стандартну номенклатуру R, де подзвонюють об'єкти сортування sort(object)
, але я розумію, чому Хедлі зробив це таким чином через проблеми, обговорені у вищезазначеному питанні.