我有一个大矩阵,它包含1,2和缺失(编码为NA)值。矩阵有500000行乘10000列。大约0.05%的1或2值,其余值为NA。
我想重新排序矩阵的行和列,以便矩阵的左上角与矩阵的其余部分相比包含相对较多的1和2。换句话说,我想通过重新排序矩阵行和列来创建矩阵的相对数据子集。
是否有一种有效的方法可以在R中实现这一点,也许是使用库?我也会对Python或Java的解决方案感兴趣,但我更愿意在R中执行此操作,因为它是我最熟悉的语言。
我认为可能会使用一组优化程序,因为我的工作矩阵太大而无法通过眼睛进行重组。
我已经恢复了一系列修改,以便问题与当前答案保持一致。
答案 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]
我怀疑这不是我想要的,所以我会更多地考虑订购“标准”