これは先週からの私の質問へのフォローアップであり、ここで見つけることができます。この質問を同じ場所に投稿するのが適切か、それとも新しい質問として投稿するのが適切かはわかりませんでした。
さて、前回、新しいベクトルをマトリックスにバインドした後、マトリックスからランダムに値を削除することについて質問しました。答えは非常に役に立ちましたが、非正方行列を使用しているときにバグを見つけました。コードをループで実行し、マトリックスの合計を毎回取得して、正しく機能していることを確認しましたが、合計が変化することがわかりました。これは、コードがマトリックスで間違った値を選択していることを意味します。 (私はそれが1つだけを選択して置き換えることを望みます)。
コードは次のとおりです。
mat1<-matrix(c(1,0,1,0, 0,1,1,1, 1,0,0,0, 1,0,0,1, 1,1,1,1, 0,0,0,1),byrow=F, nrow=4)
I.vec<-c(0,1,1,1,0,0)
foo <- function(mat, vec) {
nr <- nrow(mat)
nc <- ncol(mat)
cols <- which(vec == 1L)
rows <- sapply(seq_along(cols),
function(x, mat, cols) {
ones <- which(mat[,cols[x]] == 1L)
sample(ones, 1)
}, mat = mat, cols = cols)
ind <- (nr*(cols-1)) + rows
mat[ind] <- 0
mat <- rbind(mat, vec)
rownames(mat) <- NULL
mat
}
set.seed(2)
for (j in 1:1000){ #run this vector through the simulations
I.vec2=sample(I.vec,replace=FALSE) #randomize interactions
temp=foo(mat1,I.vec2) #run foo function
prop=sum(temp)
print.table(prop)
}
この場合、行列の合計が13になることもあれば、14になることもありますが、常に= sum(mat1)=13である必要があります。
私はコードを分解しようとしましたが、行関数を除いてすべてが正しく機能していると思います。確かに、私は完全には理解していません。