2

ループ内にさまざまな行列を作成してから、それらを結合(cbindまたはrbindのいずれか)したいと思います。ただし、次のコードは機能しません。なぜだめですか?そしてそれを修正する方法は?

dependent = matrix(c(30,184,6,106), 2, 2, byrow=T)
independent = c(160,166)
expected = numeric()
{for(i in 1:length(independent))
a = dependent*independent[i]/sum(independent)
expected = cbind(expected,a)}

これは与える:

expected
        [,1]     [,2]
[1,] 15.276074 93.69325
[2,]  3.055215 53.97546

これは、forループの最後の反復のみを使用した結果です。したがって、結果は166のみが使用されるようになりますが、160は使用されません。

4

2 に答える 2

3

for ループを完全に放棄して、次を使用できます。

X <- lapply(independent, function(x) (dependent*x)/sum(independent))
do.call("cbind", X)

編集: 順序が正しくなかったため、応答を編集しました。

于 2012-04-10T13:24:30.907 に答える
3

いくつかのコメント:

  1. ループforブラケットが間違った場所にあります。あなたが持っている:

    R> {for(i in 1:3) 
    +   cat(i, "\n")
    +   cat(i, "\n")
    + }
    1 
    2 
    3 
    3 
    

    代わりに、次のものが必要です。

    R> for(i in 1:3) {
    +   cat(i, "\n")
    +   cat(i, "\n")
    + }
    1 
    1 
    2 
    2 
    3 
    3 
    

    ループを作成forして括弧を省略すると、forステートメントの後の最初の行だけが使用されます。

  2. 繰り返しごとに変化しないためfor、結果を保存することでループをより効率的にすることができます。sum(independent)

      for(i in 1:length(independent)){
          a = dependent*independent[i]
          expected = cbind(expected,a)
       }
       expected  = expected//sum(independent)
    
  3. 実際、計算全体をベクトル化できます

    y = sapply(independent, '*', dependent)
    matrix(y, ncol=4,nrow=2)/sum(independent)
    
于 2012-04-10T13:07:30.873 に答える