dplyr mutieren mit bedingter Werte
In einem großen dataframe ("myfile") mit vier Spalten, die ich haben, um eine fünfte Spalte mit Werten bedingt auf die ersten vier Spalten.
Lieber Antworten mit dplyr
und mutate
vor allem wegen seiner Geschwindigkeit in großen Datenmengen.
Mein dataframe sieht wie folgt aus:
V1 V2 V3 V4
1 1 2 3 5
2 2 4 4 1
3 1 4 1 1
4 4 5 1 3
5 5 5 5 4
...
Die Werte der fünften Spalte (V5) basieren auf einige bedingte Regeln:
if (V1==1 & V2!=4) {
V5 <- 1
} else if (V2==4 & V3!=1) {
V5 <- 2
} else {
V5 <- 0
}
Jetzt will ich mit der mutate
- Funktion verwenden Sie diese Regeln auf alle Zeilen (um zu vermeiden, langsam Schleifen). So etwas (und ja, ich weiß, es funktioniert nicht auf diese Weise!):
myfile <- mutate(myfile, if (V1==1 & V2!=4){V5 = 1}
else if (V2==4 & V3!=1){V5 = 2}
else {V5 = 0})
Sollte dies das Ergebnis:
V1 V2 V3 V4 V5
1 1 2 3 5 1
2 2 4 4 1 2
3 1 4 1 1 0
4 4 5 1 3 0
5 5 5 5 4 0
Wie dies in dplyr
?
- Es ist nützlich, um Staat, wenn V1..4 sind alle ganzzahligen (nicht Faktor, logical, string oder float)? und kümmern Sie sich zur korrekten Handhabung
NA
, (NaN, +Inf, -Inf
)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie dies:
geben:
oder so:
geben:
Hinweis
Schlage vor, Sie bekommen einen besseren Namen für Ihre Daten-frame. myfile macht es den Anschein, als wenn es hält Sie einen Dateinamen ein.
Oben verwendet diese input:
Update 1 Da Zitat dplyr geändert hat
%.%
zu%>%
so geändert haben, dass Antworten entsprechend.Update 2 dplyr jetzt hat
case_when
bietet eine andere Lösung:ifelse
Aussagen:myfile %>% mutate(V5 = ifelse(V1 == 1 & V2 != 4, 1, 0), V5 = ifelse(V2 == 4 & V3 != 1, 2, V5))
Mit
dplyr 0.7.2
verwenden, können Sie sehr nützlichcase_when
Funktion :Ausgedrückt mit
dplyr::mutate
es gibt:Bitte beachten Sie, dass
NA
sind nicht speziell behandelt, da es irreführend sein kann. Die Funktion zurückNA
nur, wenn kein Zustand vorliegt. Wenn Sie eine Zeile mitTRUE ~ ...
, wie ich in meinem Beispiel, ist der Rückgabewert wird dann nieNA
.Daher müssen Sie ausdrücklich sagen
case_when
zu setzenNA
wo es hingehört durch hinzufügen einer Anweisung wieis.na(x$V1) | is.na(x$V3) ~ NA_integer_
. Hinweis: diedplyr::coalesce()
Funktion kann sehr hilfreich sein, hier auch mal!Außerdem, bitte beachten Sie, dass
NA
allein in der Regel nicht arbeiten, Sie haben, um spezielleNA
Werte :NA_integer_
,NA_character_
oderNA_real_
.Sieht es aus wie
derivedFactor
von dermosaic
Paket wurde konzipiert für dieses. In diesem Beispiel würde es so Aussehen:(Wenn Sie möchten, das Resultat numerisch statt eines Faktors, wickeln Sie die
derivedFactor
mit einemas.numeric
.)Beachten Sie, dass die
.default
option in Kombination mit.method = "first"
legt die "else" - Bedingung -- dieser Ansatz ist beschrieben in der Hilfe-Datei fürderivedFactor
..asFactor = F
option oder durch die Verwendung des (ähnlichen)derivedVariable
Funktion im gleichen Paket.recode
von dplyr 0.5 tun. Ich habe nicht untersucht, es allerdings noch nicht. Siehe blog.rstudio.org/2016/06/27/dplyr-0-5-0mosaic::derivedFactor
Familie von Funktionen sind sehr langsam. Wenn Sie herausfinden, warum, bitte beantworten Sie meine Frage ALSO dazu: stackoverflow.com/questions/33787691/.... Ich bin froh zu sehen, von Ihrem anderen Kommentar, dassdplyr::case_when
schneller-ich werde wechseln Sie zu dieser.