2011-08-04 11 views
2

可能性の重複:
Randomly selecting values from an existing matrix after adding a vector (in R)再:ランダム(Rで)ループの追加、行列から値を選択する

これは先週から私の質問にフォローアップすることができますです見つけられるhere。この質問を同じ場所に投稿したり、新しい質問として投稿したりするのが適切かどうかはわかりませんでした。

最後に、新しいベクトルをバインドした後、行列から値をランダムに削除することを尋ねました。答えは非常に便利でしたが、非正方行列を使用しているときにバグが見つかりました。私はループ内でコードを実行しており、毎回行列の合計を取って、正しく動作していることを確認していますが、合計が変わっていることがわかりました。これは、コードが行列の間違った値(私はそれを選択して置き換えるだけです)。ここ

コードである:この場合

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であり、時にはそれが常に= SUM(MAT1)= 13

なければならない場合、14であります

私はコードをはがそうとしましたが、行機能以外はすべて正常に動作していると思います。

+1

"フォローアップの質問"は、ローカライズされた解決策につながるため、一般的にこのサイトのフォーマットには適していません。フォローアップが受け入れられた答えに問題を提示するとき、これは特に真実です。以前の質問だけを見ている人は、それがあなたが期待した通りに動作しなかったことを知っていると思われる人は他にどのようにありますか?このサイトのすばらしいことの1つは、あなたが質問することによって他人を助けることができることです。 –

+0

申し訳ありません!フォローアップを投稿することを避けるべきですか?私は他の質問にどのように追加するか分からなかった。 – Laura

+2

「Laura」という名前の2つのアカウントが一緒にマージする必要があるようです:http://stackoverflow.com/users/866870/laura and http://stackoverflow.com/users/874102/laura。私は司会者に[email protected]にメールを送り、彼らに知らせてあなたのためにそれらをマージするように頼んでいます。 – Chase

答えて

1

問題はsample()の機能です。元のQを更新しますが、この問題は候補マトリクスの列に単一の1があることに起因します。 rowsを生成するコードは、1のセットからサンプリングしようとしています。残念ながら、sample()には、最初の引数が長さ1のベクトルである場合、1からサンプリングするかのようにsample()が処理します。 ...、nここで、nは、本当にサンプルしたいと思うセットの中の単一要素の値でした。

引数はsample()からxは、長さ1のベクトルであるとき、簡単な例は、動作を示しています

> set.seed(1) 
> replicate(10, sample(4, 1)) 
[1] 2 2 3 4 1 4 4 3 3 1 

本能的に、これらはすべて4する必要がありますが、彼らはこのために文書化され、よく知られている機能ではありません。

関連する問題