2016-04-14 228 views
2

我有這樣中的R的矩陣:行排序和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 

我無法找到任何合理的方法來做到這一點。

萬一它很重要,或使事情更簡單,我可以擺脫'其他'的類別,只是堅持'貓'和'狗'。

我需要找到一種方法來編寫這種重新排序的代碼,因爲矩陣非常大。

回答

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 
+4

可以使用'unique(crit $ TYPE)'來代替手動輸入等級, – Frank