2016-08-09 5 views
0

Probe df:Ändern einer Variable in einem Datenrahmen, nur für einige Stufen eines Faktors (evtl. mit dplyr)

df <- data.frame(x = c(runif(10,0,2*pi),runif(10,0,360)), group = gl(n = 2, k = 10, labels =c("A","B"))) 

I x nur für Gruppe A (wandeln es in Grad) ändern möchten. Mit base ich gerade:

df <- within(df,x[group == "A"] <- x[group == "A"]*180/pi) 

ich mich gefragt, ob es könnte eine Art und Weise, dies zu tun mit dplyr. Das ist falsch:

df <- df %>% filter(group == "A") %>% mutate(x = x*180/pi) 

Weil es nur die Teilmenge von df wo group == "A" zurückgibt. Gibt es eine (einfache) Möglichkeit, dies zu tun, oder ist dies ein Fall, in dem base die dplyr für Benutzerfreundlichkeit trumps?

Antwort

3

Wir können ifelse verwenden, um die logische Bedingung zu erstellen, und basierend darauf führen wir entweder die arithmetische Berechnung oder else die ursprünglichen Werte zurück.

df %>% 
    mutate(x = ifelse(group=="A", x*180/pi, x)) 

Oder wie @AlexIoannides erwähnt, if_else von dplyr kann, um die type getroffen werden sollten Pflege verwendet werden.


In data.table, kann dies durch Zuweisung an Ort und Stelle durchgeführt werden und soll effizienter sein.

library(data.table) 
setDT(df)[group=="A", x := x*180/pi] 
+1

Noch einfacher als "Basis". Vielen Dank! – DeltaIV

+3

'dplyr' hat eine eigene typsichere (r) Version von' ifelse' - 'if_else', die sich zu verwenden lohnt. –

Verwandte Themen