在for循环中组合不同的矩阵

时间:2012-04-10 12:59:26

标签: r binding for-loop

我想在循环中创建不同的矩阵,然后将它们组合(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不是。

2 个答案:

答案 0 :(得分: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)
    

答案 1 :(得分:3)

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

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

编辑:由于订单不正确,我编辑了我的回复。