R 语言中有 order, sort, rank 等函数, 我总是弄不明白, 所以, 我就打算来仔细看一下这些函数究竟是什么意思.
排序
排序是写程序中的最基础的一个需求, R 语言中有许多和排序相关的函数.
平时最常用的顺序排列函数是 base 包中的 base, order, rank. 这三个包我总是不能分清除, 每次使用的时候需要取再去查寻和理解. 其实理解 order 和 sort 有个简单的办法: 只要记住, x[order(x)]
和 sort(x)
总是返回相同的值. 那么对于 order 和 rank 的区别就稍稍有些麻烦, rank 是根据数值和所采用的排名的方法对元素进行排名, 给出每个元素的排名结果; 而 order 则按照升序或降序来排列元素, 给出排好序的向量所对应的元素的下标, 只要按照顺序去取对应下标的元素就能够得到排好序的向量.
sort 函数有两个参数常用: decreasing = FALSE
设置是升序还是降序; na.last = NA
可以是 FALSE 或者 TRUE, 确定把 NA 的值放在排好序的最前还是最后. 另外, 还可以选择排序的算法 method = c("shell", "quick")
其中 shell 算法是稳定的排序算法, 而 quick 算法是不稳定的, 在对字符串进行排序的的时候, 不稳定的算法每次给出的结果不一定一样, 不过速度会相对快一些. 另外, is.unsorted 函数可以用来判断一个向量是否排序了.
order 函数和 sort.list 函数是返回排好序的向量的对应下标的函数. order 的常用参数也是 decreasing = FALSE
用来设置升序还是降序排列, na.last = NA
设置 NA 所放的位置. 而 sort.list 函数还可以设置算法, method = c("shell", "quick", "radix")
rank 函数可以返回元素按升序的排名, 其也有 na.last = TRUE
的选项, 来确定 NA 的位置. 另外, rank 有 tie.method 这个选项, tie.method 可以取 c("average", "first", "random", "max", "min")
这些值, 是用来处理相同项的排列的. "average" 会在排名之后, 把相邻的相同相的排名平均, 比如说两个最小值相同, 分别排第 1 和第 2 位, 那么它们实际输出的排名就是 1.5. "first" 会把小的值给相同值第一个出现的值, 而给后面的相同的值逐个加一, 比如有两个相同的最小值, 那么这两个就分别是第一和第二. "random" 和 "first" 类似, 只是把相同值之间的排名进行了随机处理, 相同值中最先出现的不一定是相同的值中排名最靠前的. "max" 是把相同值的排名最大的排名给所有相同值. "min" 是把相同值的排名最小的排名给所有相同值, 有点像我们给学生排名的时候所说的并列第一.
rev 函数只是简单把一个向量反向排列, 而不考察其元素值的大小. 可以配合其他的排序函数进行使用.
打乱
有的时候, 我就需要去从数据集合中抽样或者打乱数据排列的顺序, 这个时候就需要一些随机打乱和随机抽样的函数. 常用的有 rnorm 等各种分布的随机数产生函数和 sample 函数等.