выбор столбцов, заданных случайным вектором в R - PullRequest
5 голосов
/ 01 декабря 2011

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

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

1 Ответ

4 голосов
/ 01 декабря 2011

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

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
...