Есть ли способ изменить порядок строк и столбцов матрицы, чтобы создать плотный угол, в 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]
Я подозреваю, что это не то, что нужно, поэтому я уйду и подумаю еще немного о порядке "критериев"