У меня есть большая матрица, из которой я хотел бы случайным образом извлечь меньшую матрицу.(Я хочу сделать это 1000 раз, так что в конечном итоге это будет в цикле for.) Скажем, например, что у меня есть эта матрица 9x9:
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. Я могу удалить столбцы, сумма которых равна нулю.
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?
Большое спасибо за помощь!