작은 매트릭스를 임의로 추출하고자하는 큰 매트릭스가 있습니다. (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?
도움을 주셔서 감사합니다. 나는이 문제를 이해하면
하는 최종 1000 집합 행렬은 고유해야 하는가? –
중요하지 않습니다. 샘플링 할 원본 행렬은 1174 행과 455 행이므로 대표적인 샘플링을 원합니다. 그러나, 나는 가능성의 한정된 수가 있다고 확신한다. 유일한 문제는 고유 한 부분 행렬 중 하나에 샘플링 바이어스가있는 경우입니다. – Laura