5

小さな行列をランダムに抽出したい大きな行列があります。(これを 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 になりたくないということです。もう 1 つの重要なことは、最終的な行列の行と列の元の数を知る必要があることです。したがって、行 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」で行列をサブセット化するより良い方法はありますか、または合計がないように3つの相補的な行と列をランダムに選択するより良い方法はありますか? 0?

手伝ってくれてどうもありがとう!

4

1 に答える 1

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
于 2011-12-01T17:08:30.063 に答える