2016-07-04 3 views
-1

Проблема: AF не является кумулятивным. И его что-то не так с адресацией к матричным элементам и сравнения ...операции в двойном цикле не работают R

Мои данные

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 <- 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) 
} 

Результат вызова

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 

, но я бы хотел, чтобы это было всего 5 значений в моем AFP_vec.

Пожалуйста, помогите мне. Я новичок. И я не понимаю, что случилось.

+0

Эй, пожалуйста, вы можете уточнить, что вы ожидаете от вывода. – CroGo

+0

В зависимости от значений в УФ, я выбираю элементы из матрицы vote_for или vote_against и кумулирует их. (я ожидаю, что AF - моя кумулятивная переменная). Затем я вычисляю среднее значение в одном наборе элементов (проходя один шаг в «for (i in 1: am_fr)» - loop) - AFP и вставляем в вектор AFP_vec. По моим данным, AFP_vec должен дать мне 5 значений – Chet

+0

Хорошо, что мое текущее понимание - это выход, который должен быть такой же длины, как число строк, таких как VF & VA, где значение элемента является средним для строк в VF & VA, где вы берете VF, если UV = 1 и VA, если UV = 0? – 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

большое спасибо! выглядит намного лучше :) Не нужно объяснять ваш код, Google помог мне. не так, как вы, конечно)) , но не могли бы вы так любезно объяснить, почему моя функция не работает? это был бы хороший опыт. Я хочу знать не только правильное решение, но и мои ошибки. – 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

Смежные вопросы