R语言-排序

前言

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

  order和sort是针对向量进行操作的,arrange针对数据框。其中order返还排序后的坐标,sort返还排序后的值,arrange返还的是基于某列排序后的数据框,方便多重依据排序。

目录

 1. 向量的排序

 2. 矩阵的排序

 3. 数据框排序


1. 向量的排序

  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<-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 <- cbind(x1 = 3, x2 = c(4:1, 2:5)))
x1 x2
[1,] 3 4
[2,] 3 3
[3,] 3 2
[4,] 3 1
[5,] 3 2
[6,] 3 3
[7,] 3 4
[8,] 3 5

order(x[,2])
[1] 4 3 5 2 6 1 7 8

sort(x[,2])
[1] 1 2 2 3 3 4 4 5

2. 矩阵的排序

比如说要对一个矩阵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"))

3. 数据框排序

如何利用自带函数以及plyr包对数据框进行排序

利用order

index <- order(x[,2])
x[index, ]
x1 x2
[1,] 3 1
[2,] 3 2
[3,] 3 2
[4,] 3 3
[5,] 3 3
[6,] 3 4
[7,] 3 4
[8,] 3 5

利用sort, 类似于循环操作

apply(x, 2, sort)
x1 x2
[1,] 3 1
[2,] 3 2
[3,] 3 2
[4,] 3 3
[5,] 3 3
[6,] 3 4
[7,] 3 4
[8,] 3 5

利用arrange,方便多重依据排序

library(plyr)
x <- as.data.frame(x) ## arrange只能针对数据框进行操作
arrange(x,x[,2])

posted @ 2017-06-25 16:18  银河统计  阅读(16063)  评论(0)    收藏  举报