2011-12-01 3 views
5

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

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

+0

Если конечные 1000 матриц субпопуляции быть уникальными? –

+0

Это не критично. Исходная матрица, из которой я беру выборку, составляет 1174 строки и 455 столбцов, поэтому я хочу получить репрезентативную выборку. Тем не менее, я уверен, что существует ограниченное число возможностей. Единственная проблема заключалась бы в том, что в отношении одной из уникальных подматриц существует какая-то смещение выборки. – Laura

ответ

4

Если я понял вашу проблему, я думаю, что это будет работать:

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) 

smallmatrix = matrix(0,,nrow=3,ncol=3) 

while(any(apply(smallmatrix,2,sum) ==0) | any(apply(smallmatrix,1,sum) ==0)){ 
     cols = sample(ncol(mat),3) 
     rows= sample(nrow(mat),3) 
     smallmatrix = mat[rows,cols] 
} 

colnames(smallmatrix) = cols 
rownames(smallmatrix) = rows 
+2

Ха-ха, я почти хотел опубликовать тот же ответ, но вы избили меня! Я только думаю, оценивая, если суммы строк и столбцов равны нулю, быстрее использовать 'rowSums' и' colSums': 'any (colSums (smallmatrix) == 0) | any (rowSums (smallmatrix) == 0) ' –

+0

К сожалению, я только заметил, что с помощью этого метода есть несколько строк, которые получают нулевую сумму. Любые другие идеи? – Laura

+1

Я только что исправил это. @SachaEpskamp получил это с самого начала. Я не заметил, что ограничение также применяется к строкам. Так что просто добавление или до. – aatrujillob