【问题标题】:Which is the best way to sort a matrix by column containing names in R?按 R 中包含名称的列对矩阵进行排序的最佳方法是什么?
【发布时间】:2017-05-24 17:55:58
【问题描述】:

我有一个矩阵对象,看起来像下面的矩阵。这是一个地方之间的距离矩阵,但我需要根据另一个顺序对它们进行排序,比如 CLR、LAG、CDA、ANT、CLC。我用 plyr 阅读了一些解决方案,但它们在我的情况下不起作用。

    ANT     CDA     CLC     CLR     LAGM
ANT 0.00    6.45    9.25    6.76    5.41
CDA 6.45    0.00    6.32    4.65    5.31
CLC 9.25    6.32    0.00    6.93    5.91
CLR 6.76    4.65    6.93    0.00    6.76
LAG 5.41    5.31    5.91    6.76    0.00

期望的输出(具有正确的距离)

     CLR    LAGM    CDA ANT CLC
CLR                 
LAG                 
CDA                 
ANT                 
CLC                 

【问题讨论】:

  • 请不要发布您的数据图像,请提供您想要的输出。请阅读this post,了解如何编写一个好的/可重现的问题。
  • my.o <- c("CLR", "LAGM", "CDA", "ANT", "CLC"); mat[my.o, my.o] 仅对列重新排序:mat[, my.o]
  • 我重新整理了帖子
  • 行名中有LAG,列名中有LAGM,对吗?

标签: r sorting matrix


【解决方案1】:

你可以这样做:

m <- read.table(text=
'    ANT     CDA     CLC     CLR     LAG
ANT 0.00    6.45    9.25    6.76    5.41
CDA 6.45    0.00    6.32    4.65    5.31
CLC 9.25    6.32    0.00    6.93    5.91
CLR 6.76    4.65    6.93    0.00    6.76
LAG 5.41    5.31    5.91    6.76    0.00')
m <- as.matrix(m)

my.o <- c("CLR", "LAG", "CDA", "ANT", "CLC")
m[my.o, my.o]
#      CLR  LAG  CDA  ANT  CLC
# CLR 0.00 6.76 4.65 6.76 6.93
# LAG 6.76 0.00 5.31 5.41 5.91
# CDA 4.65 5.31 0.00 6.45 6.32
# ANT 6.76 5.41 6.45 0.00 9.25
# CLC 6.93 5.91 6.32 9.25 0.00

您也可以使用整数索引:

my.o <- c(4,5,2,1,3)
m[my.o, my.o]

如果矩阵的行名和列名之间存在差异,您可以计算整数索引:

my.o <- c("CLR", "LAG", "CDA", "ANT", "CLC")
ind <- match(my.o, rownames(m))
m[ind, ind]

【讨论】:

    【解决方案2】:

    在应用任何处理之前,我会将矩阵转换为数据框。然后,排序就变成了数据框中的一个简单的order 函数。无论如何排序矩阵不是一个好主意恕我直言。

    考虑这个例子,看看你是否能弄清楚我是如何使用一个样本矩阵并在它的 2 列上排序的,并且只列出了 5 列。您可以修改为任意数量的列。

    > mat<-matrix(sample(100),nrow=10,ncol=10)
    > mat
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]   36    7   96   65   54   33   95   53   72    67
     [2,]   94   45   66   39   46    9   28   10   84   100
     [3,]   16   44   58   88    6   12   75   59   74    85
     [4,]   97   86   69   64   57   13   78   83   26    63
     [5,]    5   27   23   35   42   19   81    2   52    48
     [6,]   11   91   22   90   77   89   71   31   50    43
     [7,]   25   56   14   40   61   41   99   18   98    21
     [8,]   55   30   62   38   92    3   37    8   68     1
     [9,]   80   29   34   79   24   17   15   76   70    60
    [10,]    4   93   47   87   49   73   20   82   32    51
    
    >  x<-as.data.frame(mat)
    >  x[,c(1:5)][order(x$V3,x$V5),]
       V1 V2 V3 V4 V5
    7  25 56 14 40 61
    6  11 91 22 90 77
    5   5 27 23 35 42
    9  80 29 34 79 24
    10  4 93 47 87 49
    3  16 44 58 88  6
    8  55 30 62 38 92
    2  94 45 66 39 46
    4  97 86 69 64 57
    1  36  7 96 65 54
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多