13.4 排序
把数值数据按大小进行排序通常很有用,因为我们关心的值往往就在两端。sort
函数按向量从小到大(或从大到小)排序6:
6痴迷于排序算法的高手可能会指出sort
函数默认使用shellsort,但你亦可指定method = quick
而使用快速排序。基数排序也可用于因子中。
x <- c(2, 32, 4, 16, 8)
sort(x)
## [1] 2 4 8 16 32
sort(x, decreasing = TRUE)
## [1] 32 16 8 4 2
字符串也可以排序,但其顺序往往取决于语言环境。通常字母从a到z排序,但也有些比较奇怪的顺序:例如在爱沙尼亚语中,z位于s之后、t之前。其他奇怪的顺序都列在?Comparision
帮助页面中。在英语或北美地区,你会看到这样的结果:
sort(c("I", "shot", "the", "city", "sheriff"))
## [1] "city" "I" "sheriff" "shot" "the"
order
函数是sort
的某种逆转操作。order中的第i
个元素是x
中的元素在排序之后最终将出现的位置。这种说法有点令人头晕,你需要了解的是:x[order(x)]
将返回与sort(x)
相同的结果:
order(x)
## [1] 1 3 5 4 2
x[order(x)]
## [1] 2 4 8 16 32
identical(sort(x), x[order(x)])
## [1] TRUE
order
在对数据框排序时非常有用,因为数据框不能直接使用sort
。例如,使english_monarchs
数据框按统治的年份开始排序,可用:
year_order <- order(english_monarchs$start.of.reign)
english_monarchs[year_order, ]
plyr
包中的arrange
函数提供了一个替代函数,它只用一行就能对数据框排序:
arrange(english_monarchs, start.of.reign)
rank
函数为数据集中的每个元素给出了排名,提供了排名情况相等时的几种处理方法:
(x <- sample(3, 7, replace = TRUE))
## [1] 1 2 1 3 3 3 2
rank(x)
## [1] 1.5 3.5 1.5 6.0 6.0 6.0 3.5
rank(x, ties.method = "first")
## [1] 1 3 2 5 6 7 4