2016-04-25 3 views
1

Alle Variablen sind im data.frame 1-5 auf derselben Skala.R - Verwenden der for-Schleife, um Werte in einem Datenrahmen bedingt zu ändern

Beispiel data.frame

rpi_invert 

A B C D 
5 2 4 1 
3 5 5 2 
1 1 3 4 

Für alle Werte, die 5 entsprechen würde ich es gerne 1 ändern.

für 4 zu 2 wechseln.

für 2 Wechsel zu 4.

für 1 zu 5 wechseln.

Beispiel für data.frame, nachdem Werte geändert wurden.

rpi_invert 

A B C D 
1 4 2 5 
3 1 1 4 
5 5 3 2 

Was ich müde habe.

for(b in colnames(rpi_invert)){ 
    rpi_invert[[b]][rpi_invert[[b]] == 5] <- 1 
    rpi_invert[[b]][rpi_invert[[b]] == 4] <- 2 
    rpi_invert[[b]][rpi_invert[[b]] == 2] <- 4 
    rpi_invert[[b]][rpi_invert[[b]] == 1] <- 5 
}  

Dadurch werden nur die Werte in der ersten Zeile und nicht in der zweiten Spalte geändert.

for(b in colnames(rpi_invert)){ 
rpi_invert <- ifelse(rpi_invert[[b]] == 5,1, 
        ifelse(rpi_invert[[b]] == 4,2, 
          ifelse(rpi_invert[[b]] == 2,4, 
            ifelse(rpi_invert[[b]] == 1,5,rpi_invert[[b]])))) 
} 

Aber das gibt mir den Fehler:

Error in rpi_invert[[b]] : subscript out of bounds 

Wenn ich für eine einzelne Spalte mit den gleichen Methoden versuchen, anstatt durch die data.frame von looping dann beide Methoden arbeiten, so bin ich nicht sicher, was ist das Problem.

Ich bin sicher, was ich versuche zu tun, kann effizienter ohne eine for loop wahrscheinlich mit einer Art von Anwendung Funktion gemacht werden, aber ich bin mir nicht sicher, wie.

Jede Hilfe wird geschätzt werden bitte lassen Sie mich wissen, wenn weitere Informationen benötigt werden.

Antwort

8

Sie können versuchen (wenn Ihr data.frame ist df):

3-(df-3) 
# A B C D 
#1 1 4 2 5 
#2 3 1 1 4 
#3 5 5 3 2 

oder gleiche, aber ein bisschen anders geschrieben: 6-df

+2

Das ist wirklich clever. – nrussell

+0

@Cath Das hat super funktioniert! Ihr Weg ist viel effizienter. Wenn möglich, verstehst du, warum meine for-Schleifen nicht das machten, was ich von ihnen wollte? Wenn nicht, bin ich sicher, dass ich weitere Untersuchungen machen kann, um Schleifen besser zu verstehen. – Dre

+0

@Dre, in deiner ersten for-Schleife änderst du die Werte '5' und' 4' in '1' und' 2' mit den ersten 2 Zeilen, dann wechselst du '1's und' 2's zurück in '5's und' 4's mit den letzten 2 Zeilen so kann es nicht funktionieren. In Ihrer zweiten for-Schleife gibt es mehrere Probleme, es gibt viel zu viele eingebettete 'ifelse's, aber was den Fehler verursacht, ist, dass Sie Ihr komplettes df bei jedem" Schleifenwechsel "statt nur der Spalte' rpi_invert [[b]] ​​neu zuweisen. ' – Cath

Verwandte Themen