当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R sort 对向量进行排序或排序


R语言 sort 位于 base 包(package)。

说明

将向量或因子(部分)排序(或排序)为升序或降序。要对多个变量进行排序,例如对数据帧进行排序,请参阅 order

用法

sort(x, decreasing = FALSE, ...)

## Default S3 method:
sort(x, decreasing = FALSE, na.last = NA, ...)

sort.int(x, partial = NULL, na.last = NA, decreasing = FALSE,
         method = c("auto", "shell", "quick", "radix"), index.return = FALSE)

参数

x

为了sort一个R具有类或数字、复数、字符或逻辑向量的对象。为了sort.int、数字、复数、字符或逻辑向量或因子。

decreasing

合乎逻辑的。排序应该增加还是减少?不可用于部分排序。

...

要传递给方法或从方法传递的参数,或者(对于没有类的默认方法和对象)传递给 sort.int 的参数。

na.last

用于控制 NA 的处理。如果是TRUE,则数据中缺失的值放在最后;如果是 FALSE ,则将它们放在第一位;如果 NA ,它们将被删除。

partial

NULL 或用于部分排序的索引向量。

method

指定所使用算法的字符串。不可用于部分排序。可以缩写。

index.return

逻辑指示是否也应返回排序索引向量。 method == "radix" 支持任何 na.last 模式和数据类型,以及 na.last = NA(默认)和完全排序非因子时的其他方法。

细节

sort 是可以编写方法的泛型函数,sort.int 是内部方法,如果仅使用前三个参数,则与 S 兼容。

默认的 sort 方法将 order 用于分类对象,而分类对象又使用通用函数 xtfrm(并且可能会很慢,除非已定义 xtfrm 方法或 is.numeric(x) 为 true)。

复数值首先按实部排序,然后按虚部排序。

"auto"方法选择"radix"简称(小于 元素)数值向量、整数向量、逻辑向量和因子;否则,"shell"

除了方法 "radix" 之外,字符向量的排序顺序将取决于所使用的语言环境的整理顺序:请参阅 Comparison 。因子的排序顺序是其级别的顺序(这特别适合有序因子)。

如果 partial 不是 NULL ,则它包含结果元素的索引,这些元素将通过部分排序放置在排序数组中的正确位置。对于指定位置的每个结果值,任何小于该值的值都保证在排序数组中具有较小的索引,而任何大于该值的值都保证在排序数组中具有较大的索引。 (这样做是为了提高效率,并且许多选项不可用于部分排序。只有当 partial 有少量元素时才会显著提高效率,并且如果有,则完成完整排序(如果可能,则进行快速排序)超过 10 个。)名称将被丢弃以进行部分排序。

方法 "shell" 使用 Shellsort(Sedgewick (1986) 的 变体)。如果 x 有名称,则使用稳定修改,因此关系不会重新排序。 (这仅在存在名称时才重要。)

方法 "quick" 使用 Singleton (1969) 的 Hoare 快速排序方法实现,并且仅当 x 为数字(双精度或整数)且 partialNULL 时可用。 (对于其他类型的 x,会默默地使用 Shellsort。)它通常比 Shellsort 快一些(在长度为 100 万的向量上可能快 50%,在长度为 10 亿时快两倍),但在罕见的最坏情况下性能较差。 (Peto 使用伪随机中点进行的修改是为了使最坏的情况更加罕见。)这不是稳定的排序,并且关系可能会重新排序。

方法"radix"依靠简单的散列来随输入大小线性缩放时间,即其渐近时间复杂度为O(n)。该特定变体及其实现源自 data.table 包,由 Matt Dowle 和 Arun Srinivasan 贡献。对于小输入 (< 200),实现使用就地操作的插入排序 (O(n^2)),以避免基数排序的分配开销。对于范围小于 100,000 的整数向量,它会切换到更简单、更快的线性时间计数排序。在所有情况下,排序都是稳定的;关系的顺序被保留。它是整数向量和因子的默认方法。

"radix" 方法通常优于其他方法,特别是对于小整数。与快速排序相比,对于具有大整数或实数值的向量,它的速度稍快(但与快速排序不同,基数是稳定的并且支持所有na.last选项)。该实现比字符向量的 shell 排序快几个数量级,但排序规则不考虑区域设置,因此即使在英语区域设置中也会给出错误的答案。

但是,基数排序有一些注意事项:

  • 如果x是一个character向量,所有元素必须共享相同的编码。仅支持 UTF-8(包括 ASCII)和 Latin-1 编码。整理如下LC_COLLATE=C,即使用字节的数字顺序按字典顺序逐字节排列。

  • 不支持Long vectors(具有 或更多元素)和complex 向量。

对于 sort ,结果取决于调度的 S3 方法。如果 x 没有类,则使用 sort.int 并应用其说明。对于没有特定方法的类对象,将使用默认方法,该方法相当于 x[order(x, ...)] :这取决于具有适用于 [ 的方法的类(并且 order 也可以工作,这需要xtfrm 方法)。

为了sort.int该值是排序向量,除非index.return当结果是一个包含名为的组件的列表时为 truexix包含排序后的数字和排序索引向量。在后一种情况下,如果method == "quick"关系的顺序可能会颠倒(与sort.list)因为快速排序不稳定。为了method == "radix",index.return所有人都支持na.last模式。其他方法仅支持index.returnna.lastNA。索引向量指的是元素编号删除 NA: 看order如果你想要原始元素编号。

除了已排序的名称之外,所有属性都从返回值中删除(参见 Becker 等人,1988,第 146 页)。 (如果指定了partial,则名称也会被删除。)请注意,这意味着返回的值没有类,除了因子和有序因子(它们经过特殊处理,其结果将转换回原始类)。

例子

require(stats)

x <- swiss$Education[1:25]
x; sort(x); sort(x, partial = c(10, 15))

## illustrate 'stable' sorting (of ties):
sort(c(10:3, 2:12), method = "shell", index.return = TRUE) # is stable
## $x : 2  3  3  4  4  5  5  6  6  7  7  8  8  9  9 10 10 11 12
## $ix: 9  8 10  7 11  6 12  5 13  4 14  3 15  2 16  1 17 18 19
sort(c(10:3, 2:12), method = "quick", index.return = TRUE) # is not
## $x : 2  3  3  4  4  5  5  6  6  7  7  8  8  9  9 10 10 11 12
## $ix: 9 10  8  7 11  6 12  5 13  4 14  3 15 16  2 17  1 18 19

x <- c(1:3, 3:5, 10)
is.unsorted(x)                  # FALSE: is sorted
is.unsorted(x, strictly = TRUE) # TRUE : is not (and cannot be)
                                # sorted strictly
## Not run: 
## Small speed comparison simulation:
N <- 2000
Sim <- 20
rep <- 1000 # << adjust to your CPU
c1 <- c2 <- numeric(Sim)
for(is in seq_len(Sim)){
  x <- rnorm(N)
  c1[is] <- system.time(for(i in 1:rep) sort(x, method = "shell"))[1]
  c2[is] <- system.time(for(i in 1:rep) sort(x, method = "quick"))[1]
  stopifnot(sort(x, method = "shell") == sort(x, method = "quick"))
}
rbind(ShellSort = c1, QuickSort = c2)
cat("Speedup factor of quick sort():\n")
summary({qq <- c1 / c2; qq[is.finite(qq)]})

## A larger test
x <- rnorm(1e7)
system.time(x1 <- sort(x, method = "shell"))
system.time(x2 <- sort(x, method = "quick"))
system.time(x3 <- sort(x, method = "radix"))
stopifnot(identical(x1, x2))
stopifnot(identical(x1, x3))

## End(Not run)

参考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988). The New S Language. Wadsworth & Brooks/Cole.

Knuth, D. E. (1998). The Art of Computer Programming, Volume 3: Sorting and Searching, 2nd ed. Addison-Wesley.

Sedgewick, R. (1986). A new upper bound for Shellsort. Journal of Algorithms, 7, 159-173. doi:10.1016/0196-6774(86)90001-5.

Singleton, R. C. (1969). Algorithm 347: an efficient algorithm for sorting with minimal storage. Communications of the ACM, 12, 185-186. doi:10.1145/362875.362901.

也可以看看

Comparison’了解字符串的整理方式。

order 用于对多个变量进行排序或重新排序。

is.unsortedrank

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Sorting or Ordering Vectors。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。