【问题标题】:Order a matrix by multiple column in r在 r 中按多列对矩阵进行排序
【发布时间】:2012-08-22 16:23:00
【问题描述】:

我有一个矩阵

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

关于如何实现这一目标的任何建议?谢谢。

【问题讨论】:

    标签: r sorting matrix


    【解决方案1】:

    order 函数应该这样做。

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

    【讨论】:

    • 有一个解决方案会很好,我想要排序的列数可以变化。
    • @jmb:您应该问自己的问题,并举例说明此解决方案如何不足以满足您的需求。我可以想到一个快速破解,但其他人可能会想出比这更好的东西:df[do.call(order, c(decreasing = TRUE, data.frame(df[,1:2]))),]
    【解决方案2】:

    要完成主要答案,这是一种以编程方式完成的方法,无需手动指定列:

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多