是否有充分的理由将sort与index.return = TRUE而不是order一起使用?

时间:2018-11-16 12:46:43

标签: r sorting

sort的参数为index.return,默认为FALSE。如果将其设置为TRUE,则会得到排序索引...与使用order时基本上相同。

我的问题
在某些情况下,可以将sortindex.return = TRUE一起使用而不是order吗?

2 个答案:

答案 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的答案。

您可以使用参数methodsort(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