Есть ли способ изменить порядок строк и столбцов матрицы, чтобы создать плотный угол, в R?

У меня есть большая матрица, которая содержит 1,2 и пропущенные (закодированные как NA) значения. Матрица имеет 500000 строк на 10000 столбцов. Есть приблизительно 0,05% 1- или 2-значения, а остальные значения являются NA.

Я хотел бы изменить порядок строк и столбцов матрицы так, чтобы верхний левый угол матрицы содержал относительно большое число единиц и единиц по сравнению с остальной частью матрицы. Другими словами, я хотел бы создать относительно datarich подмножество матрицы, переупорядочив строки и столбцы матрицы.

Есть ли эффективный метод достижения этого в R, возможно, с использованием библиотеки? Я также был бы заинтересован в решениях на Python или Java, но я бы предпочел выполнить это на R, так как это язык, который мне наиболее знаком.

Я подумал, что, возможно, есть набор процедур оптимизации, которые я мог бы использовать, поскольку моя рабочая матрица слишком велика, чтобы провести реорганизацию на глаз.

Я отменил ряд изменений, так что вопрос остается в соответствии с текущими ответами.

2 ответа

Как это?

#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

Что-то вроде этого?

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]

Я подозреваю, что это не то, что нужно, поэтому я уйду и подумаю еще немного о порядке "критериев"

Другие вопросы по тегам