2016-04-04 11 views
0

Ich habe wahrscheinlich eine dumme Frage, aber ich kann einfach nicht verstehen, die Logik dahinter.For-Loop-Anweisung Verständnis

 Question 1: 
    a = c(10,20,30) 
    b = c(15,30,45) 
    c = cbind(a,b) 
    for (i in 1:ncol(c)) 
      {d[i] = c[i]+2} 

    print(d) 
    # Error d not defined 

Dann dachte ich, vielleicht brauche ich einen Platzhalter für die Frage, so habe ich die folgenden:

 Question 2: 
     d = matrix(NA, 3,2) # now have the same dimension as c   
     for (i in 1:ncol(c)){d[i] = c[i]+2} 

der Ausgang

ist
  [,1] [,2] 
     [1,] 12 NA 
     [2,] 22 NA 
     [3,] NA NA 

Ich kann die obige Ausgabe nicht interpretieren. Ich verstehe nicht, warum ich NA bekommen in Reihe 3.

Ich habe auch versucht die folgenden:

 for (i in 1:ncol(c)){d[,i] = c[,i]+2} 

dann habe ich die richtige Antwort, aber wenn ich das versucht folgende Ich erhalte eine Fehlermeldung:

 Question 3: 
     for (i in 1:ncol(c)){d[i] = c[,i]+2} 
     Warning messages: 
     1: In d[i] = c[, i] + 2 : 
     number of items to replace is not a multiple of replacement length 
     2: In d[i] = c[, i] + 2 : 
     number of items to replace is not a multiple of replacement length 

Ich weiß, ich habe eine Menge Fragen gestellt, aber wenn Sie sie für einen Dummy beantworten können, werde ich es sehr zu schätzen wissen.

+3

'c()' ist eine Funktion. Im Allgemeinen ist es eine schlechte Übung, etwas anderem zu 'c' zuzuweisen. – cory

+0

in Q1 d ist nicht definiert –

+0

Ich glaube nicht, dass ich Ihnen helfen kann, da Ihr Beitrag sehr stark von Code abhängt, der davor ausgeführt wurde. (wie @ 42 in der Antwort sagt). Wenn Sie immer noch verwirrt sind, ** starten Sie Ihre R-Sitzung ** neu und führen Sie Code für Zeile nacheinander aus. Es ist wichtig, in einer sauberen R-Sitzung zu beginnen, damit die Dinge reproduzierbar sind. Ich denke auch, dass es viel besser ist, wenn Sie mit einem ** Ziel ** beginnen, nicht nur mit einem Code, der verwirrend ist. Was ist das Ziel des Codes? Lasst uns daran arbeiten, * wie man ein Ziel erreicht *, nicht * wie man etwas kaputt * versteht. – Gregor

Antwort

0

Ich weiß, dass es eine schlechte Übung ist, Ihre eigene Frage zu beantworten, aber ich denke, dass ich nach einer ausgiebigen Suche sehr dumm antworten kann.

Warum? Weil "d" nicht existiert, also wenn c [i] gleich 1 ist, ist das 10 und addiert 2, was 12 ergibt. Das Ergebnis kann nicht auf "d" gesetzt werden, weil "d" nicht existiert, dh nicht definiert. Um das Problem zu lösen, müssen Sie "d" definieren, und das ist, was ich in Frage 2 getan habe. Definieren bedeutet, dass Sie vor dem Ausführen der for-Schleife-Anweisung einen leeren Platz erstellen müssen, wo die Ergebnisse gespeichert werden können Fall hier, daher wird R einen Fehler erzeugen.

 Question 2: 
     d = matrix(NA, 3,2) # now have the same dimension as c   
     for (i in 1:ncol(c)){d[i] = c[i]+2} 
     #[1] 12 22 NA NA NA NA 

Warum? Hier ist 1: ncol (c) gleich 1 & 2, weil nur 2 Spalten a & b sind. Wenn c [1] gleich 10 ist, ist c [2] gleich 20. Dies ist Indizierung und keine Spalten. Mit anderen Worten enthält die Spalte "a" (10, 20, 30), aber c [1] ist das erste Element der Spalte "a", das 10 ist, und c [2] ist das zweite Element, das 20 ist und so weiter. Dies unterscheidet sich von c [, 1] (schau auf das Komma vor 1), was dir einen Vektor der Spalte "a" gibt, d.h. (10, 20, 30).Der Code wird als Folgendes arbeiten:

 when i is equal to 1 then c will be equal to 10 
     the first element of matrix d will be equal to 
     d[1] = 10 +2 
     d = 12 continuing.... now i = 2 
     d[2] = 20 +2 
     d= 22 

da ich nur Spalten 1 & 2, das "i" nur 1 & 2 sein kann, wird der verbleibende Ausgang NA.

 Question 3: 
     for (i in 1:ncol(c)){d[i] = c[,i]+2} 
     #Warning messages: 
     # 1: In d[i] = c[, i] + 2 : 
     #number of items to replace is not a multiple of replacement length 
     #2: In d[i] = c[, i] + 2 : 
     #number of items to replace is not a multiple of replacement length 
     #[1] 12 17 NA NA NA NA 

hier das Hauptproblem ist, dass C [i] werden die Elemente der Spalte 1 und Spalte 2 nehmen, aber d [i] ist Index dh wenn "i" = 1, dann d [i] wird Sei das erste Element und da wir nur 2 Spalten haben, wird der Rest der Antwort NA sein. Um zu sehen, wie es uns durch den Code gehen Werke lassen

 when i is equal to 1 then c[,1] = 10 
    d[i] = 10 +2 = 12 
    The result 12 will be placed in the first element of matrix d 
    when i is equal to 2 then c[,2] = 15 
    d[i] = 15+2 = 17 
    The result 17 will be placed in the second element of the matrix d 

So ist die Ausgabe wie folgende aussehen:

   [,1] [,2] 
     [1,] 12 NA 
     [2,] 17 NA 
     [3,] NA NA 

Beachten Sie auch die Platzierung der Nummer 17. Dies ist das Ergebnis des ersten Elements der Spalte 2, aber es ist in das zweite Element der Matrix d platziert. Das ist sehr gefährlich.

+1

Es ist eigentlich eine gute Methode, Ihre eigene Frage zu beantworten: Gregor

1

Wenn in Ihrem Arbeitsbereich kein d vorhanden wäre, hätte es einen Fehler zurückgegeben, da die Zuweisung durch Indizierung zu noch nicht definierten Objekten, nun, ... nicht definiert ist. Wenn Sie d als leerer Zahlenvektor definiert hatten, würden Sie bekommen:

d <- numeric(0) 
     for (i in 1:ncol(c)) 
      {d[i] = c[i]+2} 

     print(d) 
#[1] "12.00" "22.00" # since `c` at that point was a two column matrix but c[1] and c[2] 
         # are just single values because of the way matrix indexing works. 

So haben wir nicht wirklich wissen, „warum“, in Ihrem Fall war, dass das Ergebnis, aber wir wissen, dass d gewesen in Ihrem Arbeitsbereich und war wahrscheinlich eine Matrix mit den Abmessungen 3x2.

Sie scheinen die Indizierung von Datenrahmen und Matrizen zu verwirren. Wenn M eine Matrix ist, dann ist M [1] das erste Element, das dasselbe ist wie M [1,1], was im Gegensatz zu dem Fall, wenn D ein Datenrahmen ist, D [1] die Gesamtheit der ersten Spalte, möglicherweise eine sehr ist langer Vektor, im Gegensatz zu D [1,1], der wie M [1,1] Länge 1 ist. Es gibt auch eine mögliche Verwirrung (die Sie noch nicht ausstellen), wo Neulinge in R "Länge" auf einem Datenrahmen verwenden und anstatt die Anzahl der Zeilen zurückzugeben, stattdessen sehen sie nur die Anzahl der Spalten.