【问题标题】:Ordering rows and columns of R Matrix by criteria按条件对 R 矩阵的行和列进行排序
【发布时间】:2016-04-14 19:01:48
【问题描述】:

我在 R 中有一个这样的矩阵:

  A B C D E F
A 2 5 0 1 3 6
B 5 0 0 1 5 9
C 0 0 0 0 0 1
D 6 1 1 3 4 4
E 3 1 5 2 1 6
F 0 0 1 1 7 9

mat = structure(c(2L, 5L, 0L, 6L, 3L, 0L, 5L, 0L, 0L, 1L, 1L, 0L, 0L, 
0L, 0L, 1L, 5L, 1L, 1L, 1L, 0L, 3L, 2L, 1L, 3L, 5L, 0L, 4L, 1L, 
7L, 6L, 9L, 1L, 4L, 6L, 9L), .Dim = c(6L, 6L), .Dimnames = list(
    c("A", "B", "C", "D", "E", "F"), c("A", "B", "C", "D", "E", 
    "F")))

矩阵不对称。

我想根据以下条件对行和列重新排序:

NAME TYPE
A    Dog
B    Cat
C    Cat
D    Other
E    Cat
F    Dog

crit = structure(list(NAME = c("A", "B", "C", "D", "E", "F"), TYPE = c("Dog", 
"Cat", "Cat", "Other", "Cat", "Dog")), .Names = c("NAME", "TYPE"
), row.names = c(NA, -6L), class = "data.frame")

我正在尝试对矩阵行和列进行重新排序,以便将每个类别组合在一起:

 A F B C E D
A
F
B
C
E
D

我无法找到任何合理的方法来做到这一点。

如果它很重要,或者让事情变得更简单,我可以去掉“Others”这个类别,只用“Cat”和“Dog”。

我需要找到一种方法来编写代码以实现这种重新排序,因为矩阵非常大。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    在基础中,只需按order 索引:

    mat[order(crit$TYPE), order(crit$TYPE)]
    #
    #   B C E A F D
    # B 0 0 5 5 9 1
    # C 0 0 0 0 1 0
    # E 1 5 1 3 6 2
    # A 5 0 3 2 6 1
    # F 0 1 7 0 9 1
    # D 1 1 4 6 4 3
    

    它按字母顺序排列crit$TYPE,因此CatBCE)排在DogAF)之前。如果要设置顺序,请使用因子级别:

    mat[order(factor(crit$TYPE, levels = c('Dog', 'Cat', 'Other'))), 
        order(factor(crit$TYPE, levels = c('Dog', 'Cat', 'Other')))]
    # 
    #   A F B C E D
    # A 2 6 5 0 3 1
    # F 0 9 0 1 7 1
    # B 5 9 0 0 5 1
    # C 0 1 0 0 0 0
    # E 3 6 1 5 1 2
    # D 6 4 1 1 4 3
    

    【讨论】:

    • 不用手动输入关卡,你可以使用unique(crit$TYPE)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多