2012-04-10 4 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'의 서클 2 http://www.burns-stat.com/pages/Tutor/R_inferno.pdf는 왜 이것이 매트릭스를 만드는 데 좋은 방법이 아니며 몇 가지 대안을 제시합니다. –

답변

3

몇 가지 코멘트 :

  1. 귀하의 for 루프 브래킷은 잘못된 장소에 있습니다. 당신은이 :

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

    대신 당신이해야합니다 당신이 for 루프를 구성하고 브래킷을 ommit 때, for 문 후 첫 번째 라인은

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

    을 사용한다. 그 사실 즉

    for(i in 1:length(independent)){ 
         a = dependent*independent[i] 
         expected = cbind(expected,a) 
        } 
        expected = expected//sum(independent) 
    
  2. , 각 반복 변경되지 않기 때문에

  3. 당신은 당신이 모든 계산을 벡터화 할 수 sum(independent)의 결과를 저장하여 for 루프보다 효율적으로 할 수

    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) 

EDIT : 주문이 잘못되어 편집되었습니다.