2012-04-10 66 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) 

編輯:我編輯我的迴應,因爲順序是不正確的。