당신의 선택
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
Hadley가 위의 스레드에서 지적한 것처럼 arrange()
함수를 사용할 수도 있습니다 plyr
.
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)
부착 / 분리로 인해 마이크로 벤치 마크와 호환되지 않는 것 같습니다.
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이 작업합니다. 그것에 대한 유일한 견해는 정렬 객체가 호출되는 표준 R 명명법을 위반한다는 것입니다 sort(object)
.하지만 위의 질문에서 논의 된 문제로 인해 Hadley가 왜 그렇게했는지 이해합니다.