13.4 排序

把数值数据按大小进行排序通常很有用,因为我们关心的值往往就在两端。sort函数按向量从小到大(或从大到小)排序6:

6痴迷于排序算法的高手可能会指出sort函数默认使用shellsort,但你亦可指定method = quick而使用快速排序。基数排序也可用于因子中。

  1. x <- c(2, 32, 4, 16, 8)
  2. sort(x)
  3. ## [1] 2 4 8 16 32
  4. sort(x, decreasing = TRUE)
  5. ## [1] 32 16 8 4 2

字符串也可以排序,但其顺序往往取决于语言环境。通常字母从a到z排序,但也有些比较奇怪的顺序:例如在爱沙尼亚语中,z位于s之后、t之前。其他奇怪的顺序都列在?Comparision帮助页面中。在英语或北美地区,你会看到这样的结果:

  1. sort(c("I", "shot", "the", "city", "sheriff"))
  2. ## [1] "city" "I" "sheriff" "shot" "the"

order函数是sort的某种逆转操作。order中的第i个元素是x中的元素在排序之后最终将出现的位置。这种说法有点令人头晕,你需要了解的是:x[order(x)]将返回与sort(x)相同的结果:

  1. order(x)
  2. ## [1] 1 3 5 4 2
  3. x[order(x)]
  4. ## [1] 2 4 8 16 32
  5. identical(sort(x), x[order(x)])
  6. ## [1] TRUE

order在对数据框排序时非常有用,因为数据框不能直接使用sort。例如,使english_monarchs数据框按统治的年份开始排序,可用:

  1. year_order <- order(english_monarchs$start.of.reign)
  2. english_monarchs[year_order, ]

plyr包中的arrange函数提供了一个替代函数,它只用一行就能对数据框排序:

  1. arrange(english_monarchs, start.of.reign)

rank函数为数据集中的每个元素给出了排名,提供了排名情况相等时的几种处理方法:

  1. (x <- sample(3, 7, replace = TRUE))
  2. ## [1] 1 2 1 3 3 3 2
  3. rank(x)
  4. ## [1] 1.5 3.5 1.5 6.0 6.0 6.0 3.5
  5. rank(x, ties.method = "first")
  6. ## [1] 1 3 2 5 6 7 4