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])


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM