2017-12-06 14 views
0

Beispieldatenrahmen:eine Spalte ändern, nur wenn eine bestimmte Bedingung erfüllt ist, sonst kann es nicht ändern

set.seed(1) 
df <- data.frame(x = runif(10), 
       y = runif(10), 
       group = factor(sample(LETTERS[1:10], 10, replace = TRUE))) 

Ich mag x gleich y wenn group == "A" setzen, sonst will ich nicht, es zu ändern, . Für jetzt fand ich diese Lösung:

df %<>% mutate(x = ifelse(group == "A", y, x)) 

Ist das eine gute Lösung oder gibt es bessere/schnellere Wege?

+2

Warum müssen Sie mutieren? Kannst du nicht einfach tun: 'df $ x <- ifelse (group ==" A ", y, x)'? – seeellayewhy

+1

versuchen Sie Ihren Code: Es wird nicht funktionieren. 'Fehler in ifelse (group ==" A ", y, x): Objekt 'Gruppe' nicht gefunden '. Du meintest wahrscheinlich 'df $ x <- ifelse (df $ group ==" A ", df $ y, df $ x)', aber ich bin mir nicht sicher, ob das letzte einfacher/schneller ist als das 'mutate'. Es ** könnte vielleicht schneller ** sein, vielleicht auf einem größeren Datenrahmen, aber bei meinem realen Anwendungsfall scheinen die beiden Methoden äquivalent zu sein. – DeltaIV

+1

Sorry, habe meine 'df $' s dort vergessen. Wie genau willst du verbessern, was du bereits hast? Das 'mutate' scheint ein wenig überflüssig zu sein, wenn' ifelse() 'alleine funktionieren würde, besonders wenn man bedenkt, dass es sich um eine Basislösung handelt. – seeellayewhy

Antwort

1

Ich denke, dass ist eine gute Lösung

Sie abwechselnd dplyr des if_else nutzen könnten.

Es gibt auch case_when in dplyr, aber das scheint hier zu übertreiben.

Auch

df %>% mutate(x = y * (A == "group") + x * (A != "group") 

aber ich würde diesen Ansatz hier nicht verwenden.

und if_else sind dplyr-Funktionen, also wenn Sie daran denken, diesen Code mit einem Datenbank-Backend zu verwenden, dann würden sie eher funktionieren als Nicht-dplyr-Funktionen.

Update: Ich hatte über replace auch nachgedacht, aber in dieser Situation funktioniert es nicht so gut. Sie würden schreiben müssen:

df %>% mutate(x = replace(x, group == "A", y[group =="A"])) 

die ziemlich hässlich zu sein scheint.

+0

Ich mag die Idee von "if_else" und ich werde darauf wechseln. Ich weiß nicht viel über 'ersetzen '. Würden Sie es als bessere Lösung empfehlen? Wenn ja, gehe ich auf die Hilfeseite. – DeltaIV

+1

Haben Sie den Kommentar verschoben, um zu antworten. –

Verwandte Themen