安排关于rownames和colnames的矩阵

时间:2014-02-27 15:36:09

标签: r matrix dataframe subset

图像我们有一个矩阵,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矩阵。

1 个答案:

答案 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