【问题标题】:How to reorder columns by the order of rows in the same matrix?如何按同一矩阵中的行顺序对列进行重新排序?
【发布时间】:2015-10-31 06:25:47
【问题描述】:

假设我有一个 10*10 矩阵---A,其中列的名称和顺序与行相同(a、b、c、..、j)。由于计算矩阵的特征,我必须按属性重新排序行和列,比如“attr”。假设a,c,e的attr等于1,b,f,i,j的attr等于2,d,g,h的attr等于3。我想出了一种将行重新排序的方法:

Anew <- rbind(subset(A, attr==1), subset(A, attr==2), subset(A, attr==3))

现在我有了一个新的矩阵Anew,其中行的顺序是a、c、e、b、f、i、j、d、g、h,列的顺序和a一样,...,j。我的问题是如何按照Anew 的行顺序重新排列Anew 中的列?我知道我可以使用诸如

之类的代码
cbind(Anew[,a], Anew[,c],...,Anew[,h])

但是有没有更有效的方法来做到这一点?如果矩阵是 100*100,上面的代码就很不够用了。谢谢。

【问题讨论】:

    标签: r matrix network-programming


    【解决方案1】:

    我们可以order attr 并将其用作行索引

    Anew <- A[order(as.numeric(attr(A, 'row.names'))),]
    Anew
    #          a          b           c           d           e          f          g           h            i          j
    #a -0.545880758 -1.3169081 -0.07430856 -0.03373792  0.06735770  0.5266526  1.4520752  0.14379993 -0.571243248 -0.2327672
    #c  0.419623149 -0.7622144 -1.70964518  0.61285136 -0.34365937  0.7696819 -0.4403340 -0.02557419 -1.673385810 -0.8133227
    #e  0.847460017  0.3322444 -0.64859151  0.65738044 -0.25574457 -0.1961822  0.5713866 -0.07596102  0.361212489 -0.2148936
    #b  0.536585304  0.5982691 -0.60515695 -0.58542756  0.01710596 -1.0736261  0.4082015 -0.88610999  0.422621775 -1.4203631
    #f  0.266021979 -0.4690607 -0.09411013 -1.07418134 -0.46120796  0.2047497 -1.2799872 -1.35466363  1.056864213  0.1389452
    #i -0.848370044  0.6099945 -0.11629639  0.16922669  0.33519430  1.0494212  1.3496121 -0.12316046  0.007165349  1.0451687
    #j  0.002311942  0.5163357 -0.94382724 -1.82219032 -0.23186459  0.5609812 -1.5676166  0.00104102  0.101974336  1.2101739
    #d -0.583627199 -1.4290903 -0.26869311  1.51712249 -0.66789220  1.7709054  1.3185662 -0.32773539 -1.136025931  0.4610693
    #g  0.444585270 -0.3349868 -0.08554095 -4.46956441  1.47164158 -0.5965981 -1.2388796 -0.96080882 -1.992920453  0.8442304
    #h -0.466495124  1.5362522  0.11953107  0.36904502 -0.09196032  1.1782477 -0.9225911  0.22495434  0.764385054 -1.3084503
    

    如果我们想对行和列执行此操作

     Anew1 <- A[order(as.numeric(attr(A, 'row.names'))), order(as.numeric(attr(A, 'col.names')))]
    

    数据

    set.seed(24)
    A <- matrix(rnorm(10*10), ncol=10, dimnames=list(letters[1:10], letters[1:10]))
    attr(A, 'row.names') <-  as.character(c(1, 2, 1,3, 1, 2, 3, 3, 2, 2))
    attr(A, 'col.names') <-  as.character(c(1, 2, 1,3, 1, 2, 3, 3, 2, 2))
    

    【讨论】:

    • 谢谢。它运作良好。还有一个问题,如果我不将行名和列名设置为字符,这个过程将不起作用。你介意解释一下原因吗?再次感谢。
    • @akrum,感谢您的帮助。更准确地说,如果我只用rownames(A) &lt;- letters[1:10]colnames(A)&lt;-rownames(A)命名行和列,整个过程不会给出相同的结果,我想知道为什么。
    • @tzu 我试过了,结果还是一样。看看attr。你的数据集中有这个吗?
    • 糟糕,抱歉。我错了。我的问题实际上是“如果我不同时重新排序行和列,它不会得到上面提供的相同结果。”更清楚地说,如果我先做Anew &lt;- A[order(as.numeric(attr(A, 'row.names'))),],然后再做Anew &lt;- A[,order(as.numeric(attr(A, 'col.names')))],我会得到奇怪的结果,它只包含列的名称,而不是代码Anew1 &lt;- A[order(as.numeric(attr(A, 'row.names'))), order(as.numeric(attr(A, 'col.names')))]的结果你能解释一下为什么吗?谢谢!
    • 非常感谢!现在我明白为什么了。你的解释太棒了。提醒一下,您的代码 Anew[,order(as.numeric(attr(Anew, 'col.names')))] 实际上应该是 Anew[,order(as.numeric(attr(A, 'col.names')))],因为属性没有从 A 传递到 Anew。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多