2016-07-04 9 views
-1

Das Problem: AF ist nicht cumulutaing. Und es ist etwas falsch mit der Adressierung an Matrixelementen und mit dem Vergleich ...Operationen in Doppel-for-Schleife funktioniert nicht R

Meine Daten

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) 

Ich versuche, meine Funktion aufzurufen

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

Das Ergebnis des Aufrufs

f(VF, VA, UV) 

ist

[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 

aber ich wünschte, es wäre nur 5 Werte in meinem AFP_vec.

Bitte, hilf mir. Ich bin ein Anfänger. Und ich kann nicht verstehen, was falsch ist.

+0

Hey, bitte können Sie klären, wie Sie erwarten, dass die Ausgabe aussieht. – CroGo

+0

Abhängig von den Werten in UV, wähle ich Elemente aus der Matrix vote_for oder vote_against und kumuliere sie. (Ich erwarte, dass AF meine kumulative Variable ist). Dann berechne ich den Mittelwert in einem Satz von Elementen (übergehe einen Schritt in "für (i in 1: am_fr)" - Schleife) - AFP und drücke in den Vektor AFP_vec. Nach meinen Daten, AFP_vec muss mir 5 Werte geben – Chet

+0

Ok mein derzeitiges Verständnis ist die Ausgabe sollte ein Vektor sein, der die gleiche Länge wie die Anzahl der Zeilen als VF & VA hat, wobei der Wert des Elements der Mittelwert der Zeilen ist in VF & VA, wo man VF nimmt wenn UV = 1 und VA wenn UV = 0? – CroGo

Antwort

0

Noch nicht ganz sicher von dem, was Sie nach, aber ich denke, das könnte in die richtige Richtung gehen. Ich bin glücklich, den Code bei Bedarf zu erklären.

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

vielen dank! sieht viel besser aus :) brauche ich keine erklärung deines codes, google hat mir geholfen. nicht so sehr wie du, natürlich)) aber könntest du so freundlich sein zu erklären, warum meine Funktion nicht funktioniert? es wäre eine gute Erfahrung. Ich will nicht nur die richtige Entscheidung wissen, sondern auch meine Fehler. – Chet

+0

oh, Chirayu Chamoli hat bereits geantwortet. damit ich sehen kann, was falsch war. Danke! – Chet

+0

Wenn Sie mit der Antwort zufrieden sind, können Sie eine Antwort als beantwortet markieren. @Chet – CroGo

0

Ich habe Ihren Code bearbeitet, um die Fehler darin zu korrigieren. Dies sollte jetzt funktionieren. Aber die erwähnte Lösung ist viel besser.

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

danke! Einen schönen Tag noch :) – Chet

Verwandte Themen