我有一个矩阵
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降序排列矩阵,然后按第二列排序,得到矩阵
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
有关如何实现这一目标的任何建议?感谢。
答案 0 :(得分:26)
order
函数应该这样做。
df[order(df[,1],df[,2],decreasing=TRUE),]
答案 1 :(得分:13)
要完成主要答案,这里有一种以编程方式执行此操作的方法,而无需手动指定列:
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
答案 2 :(得分:4)
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),]