?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
在对矢量进行排序时的含义。
答案 0 :(得分:9)
如?sort
所述,
如果partial不为NULL,则将其包含结果元素的索引 通过部分排序将它们放置在排序数组中的正确位置。
换句话说,以下断言总是如此:
stopifnot(sort(x, partial=pt_idx)[pt_idx] == sort(x)[pt_idx])
适用于任何x
和pt_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,则包含结果元素的索引,这些索引将通过部分排序放置在排序数组中的正确位置。对于每个结果值,在指定的位置,任何小于该值的值都保证在排序数组中具有较小的索引,并且任何更大的值都保证在排序数组中具有更大的索引。“