【3.6】R语言--sort、rank、order-排序

在R中,和排序相关的函数主要有三个:sort(),rank(),order()。

一、向量的排序

sort(x)是对向量x进行排序,返回值排序后的数值向量。 rank()是求秩的函数,它的返回值是这个向量中对应元素的“排名”,这个是向量开始的说的,第一个向量97的排名为6。 而order()的返回值是对应“排名”的元素所在向量中的位置,比如从小到大的排序,应该排在第一个位置的元素为32,它在向量的位置为5。

下面以一小段R代码来举例说明:
 > x<-c(97,93,85,74,32,100,99,67)
 > sort(x)
 [1] 32 67 74 85 93 97 99 100
 > order(x)
 [1] 5 8 4 3 2 1 7 6
 > rank(x)
 [1] 6 5 4 3 1 8 7 2

假设x为一组学生完成某项测试所花费的时间(所用时间越短,排名越靠前),rank()的返回值是这组学生所对应的排名,而order()的返回值是各个排名的学生成绩所在向量中的位置。

如何返回一个数值向量中满足某条件的元素在向量中的位置?

举例来说,x<-c(97,93,85,74,32,100,99,67),希望返回x中满足值大于50且小于90的元素在向量x中的下标。当时想了想,没觉得有什么好的方法,使用了比较繁琐的语句

sort(x,index.return=TRUE)[[2]][sort(x,index.return=TRUE)[[1]]<90&sort(x,index.return=TRUE)[[1]]>50],后来发现sort(x,index.return=TRUE)[[2]]和order(x)的返回值是一样的,而sort(x,index.return=TRUE)[[1]]和sort(x)的返回值是相同的,因此语句可以简化为order(x)[sort(x)>50&sort(x)<90]。下面是相关的R代码:

 > x
 [1] 97 93 85 74 32 100 99 67
 > sort(x,index.return=TRUE)[[2]][sort(x,index.return=TRUE)[[1]]<90&sort(x,index.return=TRUE)[[1]]>50]
 [1] 8 4 3
 > order(x)[sort(x)>50&sort(x)<90]
 [1] 8 4 3
 > sort(x,index.return=TRUE)
 $x
 [1] 32 67 74 85 93 97 99 100
 $ix
 [1] 5 8 4 3 2 1 7 6
 > order(x)
 [1] 5 8 4 3 2 1 7 6

二、矩阵的排序

比如说要对一个矩阵x进行排序,先根据第一列,然后根据第二列排序,可以用下面的语句实现:

x[order(x[,1],x[,2]),]
 上面的是按照升序的方法
 如果要降序的话,
 x[order(-x[,1],-x[,2]),]

注:向量用sort,矩阵用order

如果降序加负号,例如x[order(-x[,1],-x[,2]),],就会出现:

In Ops.factor(name) : - not meaningful for factors

如果要降序的话可以这样

sort(x, decreasing = FALSE, na.last = NA, ...);
sort.list(x, partial = NULL, na.last = TRUE, decreasing = FALSE,
method = c("shell", "quick", "radix"))

文献资料:

菜鸟的成长 http://blog.sina.com.cn/s/blog_6caea8bf0100spe9.html

高山流水 http://blog.sciencenet.cn/blog-54276-612571.html

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn

Sam avatar
About Sam
专注生物信息 专注转化医学