выбор столбцов, заданных случайным вектором в R

У меня есть большая матрица, из которой я хотел бы случайным образом извлечь меньшую матрицу. (я хочу сделать это 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. Ano еще важно то, что мне нужно знать исходное количество строк и столбцов в окончательной матрице. Итак, если я случайно выберу строки 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)

Теперь у меня есть матрица 10х10 с идентификаторами.Я могу выбирать свои строки, создавая случайный вектор и разбивая матрицу.

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?

Большое спасибо за вашу помощь!

5
задан Laura 1 December 2011 в 16:28
поделиться