當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。