在R中按多列对矩阵进行排序

23

我有一个矩阵

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

我希望首先按照第一列,再按照第二列降序排列矩阵。

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
任何关于如何实现这个的建议?谢谢。
3个回答

33

order函数应该可以解决这个问题。

df[order(df[,1],df[,2],decreasing=TRUE),]

希望有一个解决方案,可以根据需要排序的列数进行变化。 - jmb
2
@jmb:你应该提出自己的问题,并且给出一个例子,说明为什么这个解决方案不能满足你的需求。我可以想到一个快速的方法,但其他人可能会想出比这更好的方法:df[do.call(order, c(decreasing = TRUE, data.frame(df[,1:2]))),] - Joshua Ulrich
kdtools中有一个函数可以按字典顺序(或kd树顺序)对矩阵或数据框进行排序。您可以使用公式语法选择列。 - THK

18
为了完成主要答案,以下是一种通过编程的方式来实现,无需手动指定列名的方法:
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

5

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
< p >在< code >df< /code >之前的减号表示顺序是降序。设置< code >decreasing=TRUE< /code >将得到相同的结果。

df[order(df[,1],df[,2],decreasing=TRUE),]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接