2016-07-26 14 views
2

Was wäre das dplyr Analog der Durchführung der folgenden Operation in der Basis R?Filter und Filter in dplyr

iris$Sepal.Length[iris$Sepal.Length>2] <- iris$Sepal.Length[iris$Sepal.Length>2] * 10 

Ich versuche, Filter zu verwenden, kann aber nicht wieder auf den ursprünglichen Datensatz gehen (ohne join)

+0

'mutieren' mit' ifelse', z.B. 'iris%>% muate (Sepal.Length = ifelse (Sepal.Length> 2, Sepal.Length * 10, Sepal.Length))' – alistaire

+0

Benutze dplyr seit Jahren, habe das noch nicht selbst herausgefunden. Es gibt eine dplyr Erweiterung Bibliothek, die dies implementiert, aber das ist eindeutig nicht zufriedenstellend. –

+0

@alistaire Möchten Sie eine Antwort geben? Du kommst zuerst darauf. Wenn du willst, kann ich meine entfernen. – Psidom

Antwort

2

Sie mutate mit ifelse verwenden können, die gleichen Ergebnisse wie Kommentare von @alistaire zu bekommen:

iris %>% mutate(Sepal.Length = ifelse(Sepal.Length > 2, Sepal.Length * 10, Sepal.Length)) 
+1

Gute Antwort, aber irgendwie unbefriedigend. Ich vermisse wirklich ein mutate_if. –

+0

@KonradRudolph Diese Funktion wurde vorher nicht wirklich verwendet. Könnte eine bessere Lösung sein. Ich frage mich, ob das eine Spaltenbedingung ist, d.h. ein Prädikat für das Auswählen von Spalten. – Psidom

+1

Das ist der Punkt: die Funktion [existiert nicht (in dplyr)] (https://github.com/hadley/dplyr/issues/425) (dplyr 5.0 führt eine Funktion dieses Namens ein, aber es ist unerklärlich und ärgerlich macht etwas anderes). –

0

Wenn wir data.table verwenden, können wir die ifelse vermeiden und machen es schneller

library(data.table) 
as.data.table(iris)[Sepal.Length > 2, Sepal.Length := Sepal.Length * 10]