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

几点评论:

  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 回答
3

您可以完全放弃 for 循环并使用:

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

编辑:我编辑了我的回复,因为订单不正确。

于 2012-04-10T13:24:30.907 回答