【问题标题】:Arrange a matrix with regard to the rownames and colnames排列关于行名和列名的矩阵
【发布时间】:2014-03-31 03:45:19
【问题描述】:

图像我们有一个矩阵,M*N,M行N列,像

  b a d c e
a 2 1 4 3 5
b 3 2 5 4 6
c 1 3 3 2 4

我想写一个函数,取上面的矩阵,返回下面的矩阵:

  a b c d e
a 1 2 3 4 5
b 2 3 4 5 6
c 3 1 2 3 4

矩阵 M*M 的第一部分,本例中的 3*3 在行名和列名方面是对称的,总共 3*5,其余的 3*2 矩阵随后被推入。

【问题讨论】:

    标签: r matrix dataframe subset


    【解决方案1】:

    对于一个 N x M 矩阵,其中 N

    mat_ord <- function(mx) mx[, c(rownames(mx), setdiff(colnames(mx), rownames(mx)))]
    mat_ord(mx)
    

    产生:

      a b c d e
    a 1 2 3 4 5
    b 2 3 4 5 6
    c 3 1 2 3 4    
    

    要查看差异,请考虑 mx2,它的行和列的顺序与 mx 不同:

      e a b d c
    b 6 2 3 5 4
    a 5 1 2 4 3
    c 4 3 1 3 2    
    

    通过mat_ord(mx2),我们得到:

      b a c e d
    b 3 2 4 6 5
    a 2 1 3 5 4
    c 1 3 2 4 3
    

    更新:这对行和列进行排序,同时确保前 N 个列/行的对称性:

    mat_ord2 <- function(mx) mx[sort(rownames(mx)), c(sort(rownames(mx)), sort(setdiff(colnames(mx), rownames(mx))))]
    mat_ord2(mx2)
    

    产生:

      a b c d e
    a 1 2 3 4 5
    b 2 3 4 5 6
    c 3 1 2 3 4
    

    【讨论】:

    • 非常感谢,您介意放原件吗?我可以先将它们按字母顺序排序,然后重新排列。
    • @ToBeGeek,我不确定我理解你所说的“原创”是什么意思。您是否希望 mat_ord(mx2) 的结果看起来像 mat_ord(mx)(即,将行与列匹配以实现对称,但还要确保所有内容都是有序的)?
    • 是的,像这样,使行名有序,列名也有序,整个矩阵的第一个 nrow*nrow 部分是对称的。
    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多