R中排序函数的“部分”参数

时间:2014-05-10 08:49:47

标签: r sorting

?sort声明partial参数可能是NULL或部分排序的索引向量。

我试过了:

x <- c(1,3,5,2,4,6,7,9,8,10)
sort(x)
## [1]  1  2  3  4  5  6  7  8  9 10
sort(x, partial=5)
## [1]  1  3  4  2  5  6  7  9  8 10
sort(x, partial=2)
## [1]  1  2  5  3  4  6  7  9  8 10
sort(x, partial=4)
## [1]  1  2  3  4  5  6  7  9  8 10

我不确定partial在对矢量进行排序时的含义。

2 个答案:

答案 0 :(得分:9)

?sort所述,

  

如果partial不为NULL,则将其包含结果元素的索引   通过部分排序将它们放置在排序数组中的正确位置。

换句话说,以下断言总是如此:

 stopifnot(sort(x, partial=pt_idx)[pt_idx] == sort(x)[pt_idx])

适用于任何xpt_idx,例如

 x <- sample(100) # input vector
 pt_idx <- sample(1:100, 5) # indices for partial arg

此行为与Wikipedia article on partial sorting中定义的行为不同。在R sort()的情况下,我们不一定要计算 k 最小元素。

例如,如果

print(x)
##  [1]  91  85  63  80  71  69  20  39  78  67  32  56  27  79   9  66  88  23  61  75  68  81  21  90  36  84  11   3  42  43
##  [31]  17  97  57  76  55  62  24  82  28  72  25  60  14  93   2 100  98  51  29   5  59  87  44  37  16  34  48   4  49  77
##  [61]  13  95  31  15  70  18  52  58  73   1  45  40   8  30  89  99  41   7  94  47  96  12  35  19  38   6  74  50  86  65
##  [91]  54  46  33  22  26  92  53  10  64  83

pt_idx
## [1]  5 54 58 95  8

然后

sort(x, partial=pt_idx)
##  [1]   1   3   2   4   5   6   7   8  11  12   9  10  13  15  14  16  17  18  23  30  31  27  21  32  36  34  35  19  20  37
## [31]  38  33  29  22  26  25  24  28  39  41  40  42  43  48  46  44  45  47  51  50  52  49  53  54  57  56  55  58  59  60
## [61]  62  64  63  61  65  66  70  72  73  69  68  71  67  79  78  82  75  81  80  77  76  74  89  85  88  87  83  84  86  90
## [91]  92  93  91  94  95  96  97  99 100  98

此处x[5]x[54],...,x[8]被放置在正确的位置 - 我们无法对其余元素说任何其他内容。 HTH。

编辑:部分排序可能会缩短排序时间,当然如果您对此感兴趣,例如只找到一些订单统计数据。

require(microbenchmark)
x <- rnorm(100000)
microbenchmark(sort(x, partial=1:10)[1:10], sort(x)[1:10])
## Unit: milliseconds
##                           expr       min        lq    median        uq      max neval
##  sort(x, partial = 1:10)[1:10]  2.342806  2.366383  2.393426  3.631734 44.00128   100
##                  sort(x)[1:10] 16.556525 16.645339 16.745489 17.911789 18.13621   100

答案 1 :(得分:2)

关于声明“这里x [5],x [54],...,x [8]被放置在它们的正确位置”,我不认为它是正确的,它应该是“在结果中,即排序x,结果[5],结果[54],.....,结果[8],将从x放置正确的值。“

引自R手册,“如果partial不是NULL,则包含结果元素的索引,这些索引将通过部分排序放置在排序数组中的正确位置。对于每个结果值,在指定的位置,任何小于该值的值都保证在排序数组中具有较小的索引,并且任何更大的值都保证在排序数组中具有更大的索引。“