2012-02-28 16 views
1

私は1列6列の行列を持っています。その列を複製するには、私は回ですが、毎回ランダムに1つの値を変更し、各反復後にすべての列の平均と分散を計算します。例えば行列の最後に反復列を追加します

:I = 1の後

values = rnorm(6, 6, 1); matrix1 = matrix(values, 6) 

は、次のようになります。

:終わり

values2 = values 
values2[sample(1:6, 1)] = values2[sample(1:6, 1)]+runif(1, 0, 1) 
matrix2 = matrix(c(values, values2), 6) 

、私は出力そうのように見えるデータフレームをしたいと思います

i mean var 
1 1.23 2.31 
2 1.24 2.33 etc... 

多くの場合iのものです。私はループでこれを行う方法があると想像していますが、私のスキルは私がそれを理解できるほどではありません。あなたのすべての協力に感謝します!

答えて

2

これを何回行っているか知っていれば、特にiが大きければ、最終的な行列をあらかじめ作成することをお勧めします。しかし、それなし:

jitter.func <- function(x, vec) { 
    cell <- sample(1:length(vec), 1) 
    vec[cell] <- vec[cell] + runif(1, 0, 1) 

    return(c(mean=mean(vec), var=var(vec))) 
} 


i <- 10 
sapply(1:i, jitter.func, vec=values) 
+0

これは素晴らしい作品。ありがとうございましたが、おそらく私の例を簡素化して自分自身を足元に撃ったのです。 meanとvarの代わりに使用している関数では、列名が異なる必要があります。私は反復iに基づいてcolnamesにラベルを付けると思います。私はこの行を関数に追加しました:colnames(vec)= paste( "col"、1:length(vec)、sep = "")。しかし、私は間違って配列の延長と同じではないということになる。どこが間違っていますか? – jslefche

+0

気にしないでください!再度、感謝します! – jslefche

0
j <- 20 # Number of columns 
i <- 6 # Number of rows 
vec <- matrix(rnorm(i,6,1),ncol=j,nrow=i)# vector replicated j times 
idx <- sample(seq(i),j,replace=TRUE) # j random rows 
vec[cbind(idx, seq(j))] <- vec[cbind(idx, seq(j))]+runif(j) # add random number to random row in each column 
apply(vec,2,plyr::each(mean,var)) # summary statistics 
関連する問題