在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中按多列排序矩阵的主要内容,如果未能解决你的问题,请参考以下文章

在 PyQt 模型中按多列排序

在python中按大小对csv文件进行多列排序

如何在 SQL 中按多列分组并按日期排序?

如何在 Laravel 5.1 中按多列对 Illuminate Collection 进行排序?

根据给定的因子在 R 中按函数分组获取多列的百分比值

在 Laravel 中按多列分组