在r中按多列排序矩阵
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在r中按多列排序矩阵相关的知识,希望对你有一定的参考价值。
我有一个矩阵
df<-matrix(data=c(3,7,5,0,1,0,0,0,0,8,0,9), ncol=2)
rownames(df)<-c("a","b","c","d","e","f")
[,1] [,2]
a 3 0
b 7 0
c 5 0
d 0 8
e 1 0
f 0 9
我想先按列1降序排列矩阵,然后按列2排序,得到矩阵
df.ordered<-matrix(data=c(7,5,3,1,0,0,0,0,0,0,9,8),ncol=2)
rownames(df.ordered)<-c("b","c","a","e","f","d")
[,1] [,2]
b 7 0
c 5 0
a 3 0
e 1 0
f 0 9
d 0 8
有关如何实现这一目标的任何建议?谢谢。
答案
order
函数应该这样做。
df[order(df[,1],df[,2],decreasing=TRUE),]
另一答案
要完成主要答案,可以通过以下方式以编程方式执行此操作,而无需手动指定列:
set.seed(2013) # preparing my example
mat <- matrix(sample.int(10,size = 30, replace = T), ncol = 3)
mat
[,1] [,2] [,3]
[1,] 5 1 6
[2,] 10 3 1
[3,] 8 8 1
[4,] 8 9 9
[5,] 3 7 3
[6,] 8 8 5
[7,] 10 10 2
[8,] 8 10 7
[9,] 10 1 9
[10,] 9 4 5
举个简单的例子,假设我想按照它们的出现顺序使用所有列来对矩阵的行进行排序:(可以轻松地为矩阵提供索引向量)
mat[do.call(order, as.data.frame(mat)),] #could be ..as.data.frame(mat[,index_vec])..
[,1] [,2] [,3]
[1,] 3 7 3
[2,] 5 1 6
[3,] 8 8 1
[4,] 8 8 5
[5,] 8 9 9
[6,] 8 10 7
[7,] 9 4 5
[8,] 10 1 9
[9,] 10 3 1
[10,] 10 10 2
另一答案
order
功能会帮助你,试试这个:
df[order(-df[,1],-df[,2]),]
[,1] [,2]
b 7 0
c 5 0
a 3 0
e 1 0
f 0 9
d 0 8
df
之前的减号表示订单正在减少。您将获得相同的结果设置decreasing=TRUE
。
df[order(df[,1],df[,2],decreasing=TRUE),]
以上是关于在r中按多列排序矩阵的主要内容,如果未能解决你的问题,请参考以下文章