2011-12-01 6 views
5

작은 매트릭스를 임의로 추출하고자하는 큰 매트릭스가 있습니다. (I이 1000 배를하고 싶은, 그래서 궁극적으로는 for 루프에있을 것입니다.) 나는이 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) 

, 나는 임의의 3 × 3의 부분 집합을하고 싶습니다. 트릭은 최종 행렬의 행 또는 열 합계가 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은이 방식으로 행렬을 부분 집합하는 것을 싫어합니다.

제 질문은 0 열이 제거 된 후 임의의 벡터 "rand3"으로 행렬을 부분 집합하는 더 좋은 방법이 있는지 또는 거기에 3 개의 상보적인 행과 열을 임의로 선택하는 더 좋은 방법이 있는지 확인하는 것입니다. 아무 것도 그 합계 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

하하 나는 거의 같은 대답을 게시하고 싶었지만 당신은 나를 때렸다! 행과 열의 합이 0인지를 평가할 때'rowSums'와'colSums'를 사용하는 것이 더 빠르다고 생각합니다 : any (colSums (smallmatrix) == 0) | any (rowSums (smallmatrix) == 0)' –

+0

죄송 합니다만,이 메서드를 사용하여 제로 합이되는 행이있는 것으로 나타났습니다. 다른 아이디어? – Laura

+1

방금 ​​고쳤습니다. @SachaEpskamp 처음부터 바로 잡았어. 제한이 행에도 적용된다는 것을 알지 못했습니다. 그래서 그냥 또는을 추가하는 것입니다. – aatrujillob