sort
的参数为index.return
,默认为FALSE
。如果将其设置为TRUE
,则会得到排序索引...与使用order
时基本上相同。
我的问题
在某些情况下,可以将sort
与index.return = TRUE
一起使用而不是order
吗?
答案 0 :(得分:6)
order
仅给出索引,而sort
也给出值(并且index.return=T
给出list
):
x <- runif(10, 0, 100)
order(x)
# [1] 2 7 1 9 6 5 8 10 4 3
sort(x, index.return=T)
# $`x`
# [1] 0.08140348 0.18272011 0.23575252 0.51493537 0.64281259 0.92121388 0.93759670 0.96221375 0.97646916 0.97863369
#
# $ix
# [1] 2 7 1 9 6 5 8 10 4 3
对于order
,数字越大(矢量尺寸越长)似乎快一点:
x <- runif(10000000, 0, 100)
microbenchmark::microbenchmark(
sort = {sort(x, index.return=T)},
order = {x[order(x)]},
times = 100
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# sort 63.48221 67.79530 78.33724 70.74215 74.10109 173.1129 100
# order 56.46055 57.18649 60.88239 58.29462 62.13086 155.5481 100
因此,仅当您需要返回index.return = TRUE
对象时,才应该选择list
进行排序。我找不到sort
比另一个更好的例子。
答案 1 :(得分:1)
我的建议基于RLave的答案。
您可以使用参数method
,sort(x,method="quick",index.return=TRUE)
,该函数可能会比默认函数快一点。另外,如果您想要一个更快的(对于大向量)替代方法,则可以使用以下功能:
sort_order <- function(x){
indices <- order(x) #you can choose a method also but leave default.
list("x"=x[indices],"ix"=indices)
}
以下是一些基准。
microbenchmark::microbenchmark(
sort=s<-sort(x,index.return=T),
"quick sort"=sq<-sort(x,method="quick",index.return=T),
"order sort"=so<-sort_order(x),times = 10
times=10
)
Unit: seconds
expr min lq mean median uq max neval
sort 1.493714 1.662791 1.737854 1.708502 1.887993 1.960912 10
quick sort 1.366938 1.374874 1.451778 1.444342 1.480122 1.668693 10
order sort 1.181974 1.344398 1.359209 1.369108 1.424569 1.461862 10
all.equal(so,sq)
[1] TRUE
all.equal(s,so)
[1] TRUE