あなたの選択
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 )
あなたがこの関数のオリジナルの作成者の 1 人である場合は、私に連絡してください。パブリック ドメイン性に関する議論はこちら: https://chat.stackoverflow.com/transcript/message/1094290#1094290
上記のスレッドで Hadley が指摘したように、arrange()
関数を使用することもできます。plyr
library(plyr)
arrange(dd,desc(z),b)
ベンチマーク: 多くの競合があったため、各パッケージを新しい R セッションにロードしたことに注意してください。特に、doBy パッケージをロードすると、sort
「The following object(s) are masked from 'x (position 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
これらの結果と、単純さと速度の比較を考えると、plyr
パッケージにうなずく必要があります。これは単純な構文を持ちますが、複雑な操作を伴うベース R コマンドとほぼ同じくらい高速です。典型的に素晴らしいハドリー・ウィッカムの作品。私の唯一の不満は、オブジェクトの並べ替えが によって呼び出される標準の R 命名法を破ることですが、sort(object)
上記のリンクされた質問で説明されている問題のために、Hadley がそのようにした理由を理解しています。