R:排序矩阵?

时间:2016-12-13 16:13:29

标签: r sorting matrix

我有以下R矩阵:

> matrix
   8 4 3 5 7 2 1 6 ...
8  0 0 1 0 0 0 0 0
4  1 0 1 1 0 2 0 0
3  5 0 0 1 0 0 0 0
5  0 0 1 0 0 3 0 0
7  0 0 0 0 0 0 0 0
2  3 4 1 0 0 7 0 0
1  8 0 4 0 0 0 8 0
6  9 0 1 0 0 0 0 0
...
[ reached getOption("max.print") -- omitted 23 rows ]

问题:是否可以对矩阵行和列进行排序,以便

  1 2 3 4 5 6 7 8 ...
1 ...
2
3
4
5
6
7
8
...

我只找到this here,并想知道是否没有更好的原生选项。

谢谢!

2 个答案:

答案 0 :(得分:2)

假设您正在引用矩阵的行名和列名,例如在此示例矩阵

m<-matrix(scan(text="
0 0 1 0 0 0 0 0
1 0 1 1 0 2 0 0
5 0 0 1 0 0 0 0
0 0 1 0 0 3 0 0
0 0 0 0 0 0 0 0
3 4 1 0 0 7 0 0
8 0 4 0 0 0 8 0
9 0 1 0 0 0 0 0"), ncol=8)
colnames(m)<-c(8,4,3,5,7,2,1,6)
rownames(m)<-c(8,4,3,5,7,2,1,6)

您可以使用

按名称对行和列进行排序
m[, sort(colnames(m))][sort(rownames(m)), ]

行和列名称始终被视为字符串。因此,如果您有更大的数字,您可能希望在排序前转换为数字:sort(as.numeric(colnames(m)))

答案 1 :(得分:2)

您还可以使用order()功能并按位置选择行和列:

mat[order(rownames(mat)),order(colnames(mat))]

#  1 2 3 4 5 6 7 8
#1 8 0 4 0 0 0 0 8
#2 0 7 1 4 0 0 0 3
#3 0 0 0 0 1 0 0 5
#4 0 2 1 0 1 0 0 1
#5 0 3 1 0 0 0 0 0
#6 0 0 1 0 0 0 0 9
#7 0 0 0 0 0 0 0 0
#8 0 0 1 0 0 0 0 0