2016-03-23 4 views
-2

Dies ist meine Schleife:bedingt und effizient spezifische Werte in Spalte Ändern

for(i in 1:length(df$column)){ 
    if((df$column[i] == '1') |(df$column[i] == '2') | (df$column[i] == '3')){ 
    df$column[i] = '1'} 
    else{df$column[i] = '0'} 
} 

Es ist ziemlich einfach. Alles, was ich tue, ändert alle Werte 1, 2 und 3 zu 1, und der Rest zu 0 in einer bestimmten Spalte. Mein Datensatz ist jedoch sehr groß und diese Schleife dauert sehr lange. Gibt es einen besseren Weg, um das gleiche Ergebnis zu erzielen, aber schneller?

+0

Warte ich bin nicht einmal sicher, ob meine Schleife zu erreichen das gewünschte Ergebnis! Lass mich wissen, wenn ich falsch liege, aber ändert meine Schleife momentan die Werte, die 1 zu 0 haben? die Werte, die 1 haben, sollten wie 1 bleiben! – jgozal

Antwort

4

Alles, was ich tue, ändert alle Werte 2 und 3 zu 1, und der Rest auf 0 in einer bestimmten Spalte.

Dies ist so einfach wie

as.integer(df$column %in% 2:3) 
+0

warten Ich bin mir nicht einmal sicher, ob meine Schleife das gewünschte Ergebnis erzielt! Lass mich wissen, wenn ich falsch liege, aber ändert meine Schleife momentan die Werte, die 1 zu 0 haben? die Werte, die 1 haben, sollten wie 1 bleiben! – jgozal

+0

ok, also müsste ich '1: 3' machen, wenn ich 1 als 1 behalten wollte? – jgozal

+0

Ja. Schließe einfach alle, die du sein möchtest, auf der rechten Seite ein. Also, wenn Sie wollen, dass 1, 2, 3 und 7 1 sind, dann 'Spalte% in% c (1: 3, 7)' –

0

Für einen großen Datenrahmen, Sie data.table für schnellere Ergebnisse nutzen könnten:

library(data.table) 
setDT(df) 
df[, column := ifelse(column %in% 1:3, 1, 0)] 
+0

'ifelse' wird nicht wirklich benötigt, du könntest einfach mit' + 'umbrechen. Jedenfalls plus eins. – akrun

Verwandte Themen