У меня есть большая матрица, из которой я хотел бы случайным образом извлечь меньшую матрицу. (Я хочу сделать это в 1000 раз, так что в итоге будет в цикле). Скажем, например, что у меня есть это 9x9 матрица:выбор столбцов, заданных случайным вектором в R
mat=matrix(c(0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,
0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,
1,0,1,0,0,0,0,0,1,0,1,0,0,0,1), nrow=9)
Из этой матрицы, я хотел бы случайное 3x3 подмножество. Хитрость заключается в том, что я не хочу, чтобы любые суммы строк или столбцов в финальной матрице были равны 0. Еще одна важная вещь: мне нужно знать исходное число строк и столбцов в конечной матрице. Итак, если я в конечном итоге произвольно выбираю строки 4, 5 и 7 и столбцы 1, 3 и 8, я хочу, чтобы эти идентификаторы были легко доступны в финальной матрице.
Вот что я сделал до сих пор.
Во-первых, я создаю вектор чисел строк и номеров столбцов. Я стараюсь, чтобы они были привязаны к матрице повсюду.
r.num<-seq(from=1,to=nrow(mat),by=1) #vector of row numbers
c.num<-seq(from=0, to=(ncol(mat)+1),by=1) #vector of col numbers (adj for r.num)
mat.1<-cbind(r.num,mat)
mat.2<-rbind(c.num,mat.1)
Теперь у меня есть матрица 10x10 с идентификаторами. Я могу выбрать свои строки, создав случайный вектор и подмножество матрицы.
rand <- sample(r.num,3)
temp1 <- rbind(mat.2[1,],mat.2[rand,]) #keep the identifier row
Это хорошо работает! Теперь я хочу случайным образом выбрать 3 столбца. Здесь я столкнулся с бедой. Я пробовал делать то же самое.
rand2 <- sample(c.num,3)
temp2 <- cbind(temp1[,1],temp1[,rand2])
Проблема заключается в том, что я в конечном итоге с некоторыми строк и столбцов сумм, 0. Я могу устранить столбцы, что сумма в 0 первый.
temp3 <- temp1[,which(colSums(temp1[2:nrow(temp1),])>0)]
cols <- which(colSums(temp1[2:nrow(temp1),2:ncol(temp1)])>0)
rand3 <- sample(cols,3)
temp4 <- cbind(temp3[,1],temp3[,rand3])
Но в итоге я получаю сообщение об ошибке. По какой-то причине R не любит подмножать матрицу таким образом.
Итак, мой вопрос в том, есть ли лучший способ подмножества матрицы случайным вектором «rand3» после удаления нулевых столбцов или существует лучший способ случайного выбора трех дополнительных строк и столбцов, таких как ни одна из них не равна 0?
Большое вам спасибо за помощь!
Если конечные 1000 матриц субпопуляции быть уникальными? –
Это не критично. Исходная матрица, из которой я беру выборку, составляет 1174 строки и 455 столбцов, поэтому я хочу получить репрезентативную выборку. Тем не менее, я уверен, что существует ограниченное число возможностей. Единственная проблема заключалась бы в том, что в отношении одной из уникальных подматриц существует какая-то смещение выборки. – Laura