2016-07-04 4 views
-1

문제 : AF가 누적되지 않습니다. 그리고 행렬 요소와 비교하여 해결 문제는 무엇인가 ...이중 for 루프에서 작동하지 않습니다. R

내 데이터

내 기능

를 호출

f <- function(VF, VA, UV) { 
    vote_for <- VF 
    vote_against <- VA 
    user_vote <- UV 
    am_law <- ncol(vote_for) 
    am_fr <- nrow(vote_for) 
    AF <- 0 
    AFP_vec <- c(0) 
    for (i in 1:am_fr) { 
    AF <- 0 
    for (j in 1:am_law) { 
     if (user_vote[j] == 1) { 
     AF <- AF + vote_for[i][j] 
     } else { 
     AF <- AF + vote_against[i][j] 
     } 
    } 
    AFP <- AF/am_law 
    append(AFP_vec, AFP) 
    } 
    return(AFP_vec) 
} 

결과를 호출하려고

VF <- matrix(c(40, 70, 80, 35, 
      90, 66, 15, 46, 
      50, 52, 60, 80, 
      30, 73, 30, 40, 
      80, 70, 76, 69), nrow = 5, byrow = TRUE) 

VA <- matrix(c(40, 25, 67, 43, 
       5, 26, 80, 43, 
       45, 35, 30, 10, 
       63, 13, 60, 45, 
       10, 19, 11, 22), nrow = 5, byrow = TRUE) 

UV <- c(1, 0, 0, 1) 

f(VF, VA, UV) 

[1] 40 [1] NA [1] NA [1] NA [1] 90 [1] NA [1] NA [1] NA [1] 50 
[1] NA [1] NA [1] NA [1] 30 [1] NA [1] NA [1] NA [1] 80 [1] NA [1] NA [1] NA [1] 0 

하지만 내 AFP_vec에는 5 개의 값만 있으면 좋겠다.

제발 도와주세요. 나는 초급이다. 그리고 나는 틀린 것을 이해할 수 없다.

+0

안녕하세요. 출력이 어떻게 생겼는지 예상 할 수 있습니까? – CroGo

+0

UV의 값에 따라, 나는 행렬 vote_for 또는 vote_against에서 요소를 선택하여 누적합니다. (나는 AF가 내 누적 변수라고 기대한다). 그런 다음 한 세트의 요소에서 평균을 계산합니다 (AFP_vec에 "for (i in 1 : am_fr)"- 루프) - AFP와 AFP_vec를 한 단계 씩 전달합니다. 내 데이터에 따르면 AFP_vec는 5 개의 값을 제공해야합니다. – Chet

+0

현재 이해해야 할 점은 VF 및 VA와 같은 행의 길이와 동일한 길이의 벡터이어야합니다. 여기서 요소의 값은 행의 평균입니다. VF & VA에서 UV = 1이면 VF를 취하고 UV = 0이면 VA를 취합니다. – CroGo

답변

0

아직도 당신의 후유증에 대해 확신 할 수 없지만 이것이 올바른 줄을 따라 있다고 생각합니다. 필요한 경우 코드를 설명해 드리겠습니다.

VF <- matrix(
    c(40 , 70 , 80 ,35, 
    90 , 66 , 15 , 46, 
    50 , 52 , 60 , 80, 
    30 , 73 , 30 , 40, 
    80 , 70 , 76 , 69) , nrow = 5 , byrow = T 
) 

VA <- matrix(
    c(40, 25, 67 , 43, 
    5, 26 , 80 , 43, 
    45 , 35 , 30 , 10 , 
    63 , 13, 60 , 45, 
    10 , 19 , 11, 22), nrow = 5 , byrow = T 
) 

UV <- c(1, 0, 0, 1) 


mat <- (t(VF) * UV) + (t(VA) * ! UV) 
apply(mat , 2 , mean) 
+0

고마워요! 훨씬 더 좋아 보인다 :) 당신의 코드에 대한 설명이 필요 없다. 구글이 나를 도왔다. 그리 많지는 않지만)) 하지만 내 기능이 작동하지 않는 이유를 설명해 주실 수 있습니까? 그것은 좋은 경험이 될 것입니다. 나는 올바른 결정뿐만 아니라 나의 실수도 알고 싶다. – Chet

+0

아, Chirayu Chamoli는 이미 대답했습니다. 그래서 나는 무엇이 잘못되었는지 알 수 있습니다. 고맙습니다! – Chet

+0

답변에 만족한다면 언제든지 답변으로 표시 할 수 있습니까? @Chet – CroGo

0

오류를 수정하기 위해 코드를 편집했습니다. 이것은 지금 작동해야합니다. 그러나 언급 된 솔루션이 훨씬 좋습니다.

fun<-function(VF,VA,UV) 
{ 
    vote_for<-VF 
    vote_against<-VA 
    user_vote<-UV 
    am_law<-ncol(vote_for) 
    am_fr<-nrow(vote_for) 
    AF<-0 
    AFP_vec<-list() 
    for (i in 1:am_fr) 
    { 
     AF<-0 
     for (j in 1:am_law) 
     { 

      if (user_vote[j] == 1){ AF=AF+vote_for[i,j]} 
      else { AF=AF+vote_against[i,j] } 

     } 

     AFP<-AF/am_law 
     AFP_vec[i]=AFP 
    } 
    return(AFP_vec) } 


res=fun(VF,VA,UV) 
+0

고마워요! 좋은 하루 되세요 :) – Chet

관련 문제