如何对列和行进行排序以创建相对密集的子矩阵

时间:2014-05-15 13:20:06

标签: r matrix

我有一个大矩阵,它包含1,2和缺失(编码为NA)值。矩阵有500000行乘10000列。大约0.05%的1或2值,其余值为NA。

我想重新排序矩阵的行和列,以便矩阵的左上角与矩阵的其余部分相比包含相对较多的1和2。换句话说,我想通过重新排序矩阵行和列来创建矩阵的相对数据子集。

在R中有没有一种有效的方法来实现这一目标?

特别是,我对解决方案感兴趣,在这些解决方案中,按行和列中的非NA值的数量排序不足以产生密集角。

此外,我还会添加一个约束。密集角的大小将是预先定义的。

在下面的示例中,目标是对行和列重新排序,以使最左上方的3x3子矩阵相对密集(即很少或没有NA值)。

m1 <- matrix(c(rep(c(rep(NA, 3), rep(1, 7)), 1), rep(c(rep(2, 3), rep(NA, 7)), 7), rep(c(rep(NA, 3), rep(1, 7)), 2) ), nrow=10, byrow=TRUE)

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   NA   NA   NA    1    1    1    1    1    1     1
 [2,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
 [3,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
 [4,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
 [5,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
 [6,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
 [7,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
 [8,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
 [9,]   NA   NA   NA    1    1    1    1    1    1     1
[10,]   NA   NA   NA    1    1    1    1    1    1     1

行和列按非NA值的数量排序(使用下面答案中的代码):

m1 <- m1[order(rowSums(is.na(m1))), order(colSums(is.na(m1)))]

但是,这不会导致最左上角密集的3x3:

         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    [1,]   NA   NA   NA    1    1    1    1    1    1     1
    [2,]   NA   NA   NA    1    1    1    1    1    1     1
    [3,]   NA   NA   NA    1    1    1    1    1    1     1
    [4,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
    [5,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
    [6,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
    [7,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
    [8,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
    [9,]    2    2    2   NA   NA   NA   NA   NA   NA    NA
   [10,]    2    2    2   NA   NA   NA   NA   NA   NA    NA

我认为可能有一套优化程序可以实现,因为我的工作矩阵太大而无法通过眼睛进行重组。

0 个答案:

没有答案