我有以下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,并想知道是否没有更好的原生选项。
谢谢!
答案 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