2012-04-10 67 views
2

我想在一个循环中创建不同的矩阵,然后将它们组合(或者是cbind或者rbind)。但下面的代码不起作用。为什么不?以及如何解决它?在for循环中组合不同的矩阵

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 

这仅仅是使用的最后迭代循环的结果。所以结果是只有166被使用,但160不是。

+3

'The R Inferno'http://www.burns-stat.com/pages/Tutor/R_inferno.pdf的圈2说明了为什么这不是构建矩阵的好方法,并给出了一些替代方案。 – 2012-04-11 08:20:25

回答

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环和ommit括号,只有for语句后的第一行使用。

  2. 你可以让你for循环更有效率节省sum(independent)的结果,因为这并不在每次迭代改变,即

    for(i in 1:length(independent)){ 
         a = dependent*independent[i] 
         expected = cbind(expected,a) 
        } 
        expected = expected//sum(independent) 
    
  3. 事实上,你可以vectorise整个计算

    y = sapply(independent, '*', dependent) 
    matrix(y, ncol=4,nrow=2)/sum(independent) 
    
3

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

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

编辑:我编辑我的回应,因为顺序是不正确的。