有没有办法重新排序矩阵的行和列以创建一个密集的角,在R?

时间:2014-05-14 14:15:45

标签: r matrix

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

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

是否有一种有效的方法可以在R中实现这一点,也许是使用库?我也会对Python或Java的解决方案感兴趣,但我更愿意在R中执行此操作,因为它是我最熟悉的语言。

我认为可能会使用一组优化程序,因为我的工作矩阵太大而无法通过眼睛进行重组。

我已经恢复了一系列修改,以便问题与当前答案保持一致。

2 个答案:

答案 0 :(得分:3)

喜欢这个吗?

#some sparse data
set.seed(42)
p <- 0.0005
mat <- matrix(sample(c(1, 2, NA), 1e4, TRUE, c(p/2, p/2, 1-p)), ncol=50)

#order columns and rows by the number of NA values in them   
mat <- mat[order(rowSums(is.na(mat))), order(colSums(is.na(mat)))]

#only show columns and rows containing non-NA values
mat[rowSums(!is.na(mat)) > 0, colSums(!is.na(mat)) > 0]
#       [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]   NA   NA   NA   NA    2   NA
# [2,]   NA   NA   NA   NA   NA    2
# [3,]   NA   NA    2   NA   NA   NA
# [4,]   NA    1   NA   NA   NA   NA
# [5,]    1   NA   NA   NA   NA   NA
# [6,]   NA   NA   NA    2   NA   NA

答案 1 :(得分:2)

这样的东西?

Rgames> bar
     [,1] [,2] [,3] [,4] [,5]
[1,]   NA   NA   NA   NA   NA
[2,]    1   NA   NA   NA    3
[3,]   NA   NA   NA   NA   NA
[4,]    2   NA   NA   NA    4
[5,]   NA   NA   NA   NA   NA

Rgames> rab<-bar[order(bar[,1]),]
Rgames> rab
     [,1] [,2] [,3] [,4] [,5]
[1,]    1   NA   NA   NA    3
[2,]    2   NA   NA   NA    4
[3,]   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA
[5,]   NA   NA   NA   NA   NA
Rgames> rab[,order(rab[1,])]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3   NA   NA   NA
[2,]    2    4   NA   NA   NA
[3,]   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA
[5,]   NA   NA   NA   NA   NA
正如罗兰指出的那样,编辑在一个更为普遍的情况下将无法接近。现在,如果允许一个人“混杂”行和列,那就可以了:

for(j in 1:nrow(mfoo)) mat[j,]<-mat[j,order(mat[j,])]

for(j in 1:ncol(mat)) mat[,j]<-mat[order(mat[,j]),j]

我怀疑这不是我想要的,所以我会更多地考虑订购“标准”