[英]Argument “partial” of the sort function in R
?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
意义。
作为?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关于部分排序的文章中定义的行为不同。 在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
关于声明“这里x [5],x [54],...,x [8]被放置在它们的正确位置”,我不认为它是正确的,它应该是“在结果中,即排序x ,结果[5],结果[54],.....,结果[8],将放置来自x的正确值。“
R手册引用:
如果partial不为NULL,则包含结果元素的索引,这些索引将通过部分排序放置在排序数组中的正确位置。 对于指定位置中的每个结果值,任何小于该值的值都保证在排序数组中具有较小的索引,并且任何更大的值都保证在排序数组中具有更大的索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.