我在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
我无法找到任何合理的方法。
如果它很重要,或者让事情变得简单,我可以摆脱“其他”类别,并坚持使用“猫”和“狗”。
我需要找到一种方法来编写代码,以便重新排序,因为矩阵非常大。
答案 0 :(得分:2)
在base中,只需按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
排序,Cat
(B
,C
和E
)排在Dog
之前({1}} A
和F
)。如果要设置顺序,请使用因子级别:
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