我有一个大矩阵,它包含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
我认为可能有一套优化程序可以实现,因为我的工作矩阵太大而无法通过眼睛进行重组。