图像我们有一个矩阵,M * N,M行和N列,如
b a d c e
a 2 1 4 3 5
b 3 2 5 4 6
c 1 3 3 2 4
我想编写一个函数,其中取上述矩阵,返回以下矩阵:
a b c d e
a 1 2 3 4 5
b 2 3 4 5 6
c 3 1 2 3 4
如果矩阵M * M的第一部分,在这种情况下3 * 3在rownames和colnames方面是对称的,并且总共3 * 5,则之后推动其余的3 * 2矩阵。
答案 0 :(得分:1)
对于N <= M矩阵,其中N <= M且所有行名称都包含在列名中,这将使名称中存在行名称的列以与行名称相同的顺序排在前面,并离开在此之后,其余列按原始顺序排列:
mat_ord <- function(mx) mx[, c(rownames(mx), setdiff(colnames(mx), rownames(mx)))]
mat_ord(mx)
产生
a b c d e
a 1 2 3 4 5
b 2 3 4 5 6
c 3 1 2 3 4
要查看差异,请考虑mx2
,其行和列的排序方式与mx不同:
e a b d c
b 6 2 3 5 4
a 5 1 2 4 3
c 4 3 1 3 2
我们得到mat_ord(mx2)
:
b a c e d
b 3 2 4 6 5
a 2 1 3 5 4
c 1 3 2 4 3
UPDATE:这会对行和列进行排序,同时确保前N个列/行的对称性:
mat_ord2 <- function(mx) mx[sort(rownames(mx)), c(sort(rownames(mx)), sort(setdiff(colnames(mx), rownames(mx))))]
mat_ord2(mx2)
产生
a b c d e
a 1 2 3 4 5
b 2 3 4 5 6
c 3 1 2 3 4