Datenanalyse ist ohne Bedingungen, mit denen Variablen erstellt oder verändert werden, nicht möglich. Die am häufigsten verwendeten Funktionen für Bedingungen sind ifelse() (aus Base R), if_else() (aus dplyr) und case_when() (aus dplyr).
ifelse()
Mit ifelse() aus Base R wird eine Bedingung mit folgender Syntax definiert:
ifelse(VILLKORET, OM_SANT, OM_FALSKT)
- An erster Position (
VILLKORET) wird die Bedingung angegeben. - An zweiter Position (
OM_SANT) wird angegeben, was die Funktion zurückgeben soll, wenn die Bedingung wahr ist. - An dritter Position (
OM_FALSKT) wird angegeben, was die Funktion zurückgeben soll, wenn die Bedingung falsch ist.
Wir verwenden diese Funktion nun, um eine neue Variable namens ny_variabel zu erstellen. Diese Variable erhält den Wert 0, wenn Var kleiner als 5 ist, andernfalls den Wert 1:
my_data |>
mutate(ny_variabel = ifelse(Var1 < 5, 0, 1)) Var1 Var2 Var3 Var4 Var5 ny_variabel
NA 1 Ja 0.276 a NA
5 NA Nej 1.15 b 1
9 3 NA 0.162 c 1
5 6 Ja -0.517 d 1
3 1 Ja 1.36 e 0
4 12 Ja -0.454 f 0
10 0 Ja -0.445 g 1
20 12 Nej 0.394 h 1
30 3 NA -0.642 i 1Das hat funktioniert, mit der Ausnahme, dass die erste Beobachtung bei ny_variabel den Wert NA (fehlend) erhalten hat. Die Erklärung dafür ist einfach: Für diese Beobachtung fehlt die Angabe zu Var1, sodass die Bedingung nicht ausgewertet werden kann. Wir können jedoch in der Bedingung festlegen, wie mit NA umgegangen werden soll. Im nächsten Beispiel erweitern wir die Bedingung so, dass auch fehlende Werte (NA) den Wert 0 erhalten. Dazu verwenden wir die Funktion is.na() und den Operator |, der "oder" bedeutet.
my_data |>
mutate(ny_variabel = ifelse(Var1 < 5 | is.na(Var1), 0, 1)) Var1 Var2 Var3 Var4 Var5 ny_variabel
1 NA 1 Ja 0.276 a 0
2 5 NA Nej 1.15 b 1
3 9 3 NA 0.162 c 1
4 5 6 Ja -0.517 d 1
5 3 1 Ja 1.36 e 0
6 4 12 Ja -0.454 f 0
7 10 0 Ja -0.445 g 1
8 20 12 Nej 0.394 h 1
9 30 3 NA -0.642 i 1ifelse() kann umständlich werden, wenn mehrere Bedingungen nacheinander ausgewertet werden müssen, was sehr häufig vorkommt. Um dies mit ifelse() umzusetzen, muss das dritte Argument durch ein weiteres ifelse() ersetzt werden. Ein Beispiel dafür:
my_data |>
mutate(ny_variabel = ifelse(Var1 < 4, "Mindre än 4",
ifelse(Var1 < 7, "Mindre än 7",
ifelse(Var1 < 10, "Mindre än 10", "Övriga")))) Var1 Var2 Var3 Var4 Var5 ny_variabel
1 NA 1 Ja 0.276 a NA
2 5 NA Nej 1.15 b Mindre än 7
3 9 3 NA 0.162 c Mindre än 10
4 5 6 Ja -0.517 d Mindre än 7
5 3 1 Ja 1.36 e Mindre än 4
6 4 12 Ja -0.454 f Mindre än 7
7 10 0 Ja -0.445 g Övriga
8 20 12 Nej 0.394 h Övriga
9 30 3 NA -0.642 i ÖvrigaBeachten Sie, dass das letzte Argument (oben als "Övriga" angegeben) der Wert ist, der zurückgegeben wird, wenn keine der Bedingungen zutrifft. Beachten Sie außerdem, dass ganz am Ende sämtliche Klammern geschlossen werden müssen.
if_else()
In dplyr gibt es die Funktion if_else(), die ifelse() ähnelt. Die Unterschiede zwischen diesen Funktionen werden im Folgenden gezeigt.
if_else() ist strenger als ifelse()
Betrachten Sie den folgenden Befehl und das Ergebnis mit ifelse():
my_data |>
mutate(ny_variabel = ifelse(Var1 < 4, "Mindre än 4", 0)) Var1 Var2 Var3 Var4 Var5 ny_variabel
1 NA 1 Ja 0.276 a NA
2 5 NA Nej 1.15 b 0
3 9 3 NA 0.162 c 0
4 5 6 Ja -0.517 d 0
5 3 1 Ja 1.36 e Mindre än 4
6 4 12 Ja -0.454 f 0
7 10 0 Ja -0.445 g 0
8 20 12 Nej 0.394 h 0
9 30 3 NA -0.642 i 0Der Code scheint funktioniert zu haben. Nun wird derselbe Code wiederholt, nur dass ifelse() durch if_else() ersetzt wird:
my_data |>
mutate(ny_variabel = if_else(Var1 < 4, "Mindre än 4", 0))Error in `mutate()`:
! Problem while computing `ny_variabel = if_else(Var1 < 4, "Mindre än 4", 0)`.
Caused by error in `if_else()`:
! `false` must be a character vector, not a double vector.Dies führte dagegen zu einem Fehler. Der Grund dafür ist, dass die Bedingung eine Zeichenkette ("Mindre än 4") zurückgibt, wenn sie wahr ist, und einen numerischen Wert (0), wenn sie falsch ist. Das akzeptiert if_else() nicht, da die möglichen Rückgabewerte vom selben Typ sein müssen.
if_else() wandelt Datumsvariablen nicht in numerische Werte um
Sehen Sie sich das folgende Beispiel mit dem Ergebnis von ifelse() an:
## Erstellt 3 Datumsangaben mit den Funktionen c() und ymd()
my_dates <- ymd(c('2021-10-01', '2022-10-02', '2021-10-03'))
## Wertet eine Bedingung aus und speichert sie als neues Objekt
my_dates_2 <- ifelse(my_dates == '2022-10-02', my_dates + 1, my_dates)
## Zeigt, welche Klasse der Vektor hat
class(my_dates_2)[1] "Numeric"Derselbe Code wird wiederholt, wobei ifelse() durch if_else() ersetzt wird:
## Erstellt 3 Datumsangaben mit den Funktionen c() und ymd()
my_dates <- ymd(c('2021-10-01', '2022-10-02', '2021-10-03'))
## Wertet eine Bedingung aus und speichert sie als neues Objekt
my_dates_2 <- if_else(my_dates == '2022-10-02', my_dates + 1, my_dates)
## Zeigt, welche Klasse der Vektor hat
class(my_dates_2)[1] "Date"if_else() hat ein zusätzliches Argument für fehlende Werte
Wir wiederholen das erste Beispiel, nun aber mit if_else(), und geben einen Wert für fehlende Werte an:
my_data |>
mutate(ny_variabel = if_else(Var1 < 4, "Mindre än 4", "4 eller mer", missing="Saknas")) Var1 Var2 Var3 Var4 Var5 ny_variabel
1 NA 1 Ja 0.276 a Saknas
2 5 NA Nej 1.15 b 4 eller mer
3 9 3 NA 0.162 c 4 eller mer
4 5 6 Ja -0.517 d 4 eller mer
5 3 1 Ja 1.36 e Mindre än 4
6 4 12 Ja -0.454 f 4 eller mer
7 10 0 Ja -0.445 g 4 eller mer
8 20 12 Nej 0.394 h 4 eller mer
9 30 3 NA -0.642 i 4 eller merif_else() ist schneller als ifelse()
Nicht zuletzt ist if_else() schneller als ifelse().
case_when()
Anstatt verschachtelte ifelse()- oder if_else()-Anweisungen zu erstellen, kann case_when() verwendet werden. Mit dieser Funktion lässt sich in effizienter Syntax eine Reihe aufeinanderfolgender Bedingungen angeben. Die Bedingungen werden nacheinander geprüft. Beachten Sie, dass bei case_when() die Tilde ~ verwendet wird. Links von ~ steht die Bedingung, rechts von ~ der Wert, den die Funktion zurückgeben soll, wenn die Bedingung zutrifft. Beachten Sie außerdem, dass wir fehlende Werte mit der Funktion is.na() angeben können.
my_data |> mutate(ny_variabel = case_when(Var1 == 3 ~ "Lika med 3",
Var1 > 3 ~ "Större än 3",
Var1 > 6 ~ "Större än 6",
Var1 > 9 ~ "Större än 9",
is.na(Var1) ~ "Saknas")) Var1 Var2 Var3 Var4 Var5 ny_variabel
1 NA 1 Ja 0.276 a Saknas
2 5 NA Nej 1.15 b Större än 3
3 9 3 NA 0.162 c Större än 3
4 5 6 Ja -0.517 d Större än 3
5 3 1 Ja 1.36 e Lika med 3
6 4 12 Ja -0.454 f Större än 3
7 10 0 Ja -0.445 g Större än 3
8 20 12 Nej 0.394 h Större än 3
9 30 3 NA -0.642 i Större än 3