哪个是通过包含R中的名称的列对矩阵进行排序的最佳方法?

时间:2017-05-24 17:55:58

标签: r sorting matrix

我有一个矩阵对象,看起来像下面的矩阵。它是地方之间的距离矩阵,但我需要根据另一个顺序对它们进行排序,例如 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                 

2 个答案:

答案 0 :(得分:1)

你可以这样做:

.information {
    display: none;
    width: 100%;
    background-color: transparent;
}

.information-wrapper {
  margin-top: 1%;
  background-color: #04395e;
  height: 180px;
  width: 100%;
}

您也可以使用整数索引:

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

如果矩阵的rownames和columnames之间存在差异,则可以计算整数索引:

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

答案 1 :(得分:0)

在应用任何处理之前,我会将矩阵转换为数据帧。然后排序成为数据框中的简单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