A: der unterschied zwischen ifelse() und if_else()


Die Funktion dplyr if_else() hat gegenüber der R-Basisfunktion ifelse() drei Vorteile:

1. Die Funktion if_else() prüft, ob die beiden Alternativen in der if else-Anweisung denselben Datentyp haben.

2. Die Funktion if_else() konvertiert Datumsobjekte nicht in numerische Objekte.

3. Die Funktion if_else() bietet ein „fehlendes“ Argument, um anzugeben, wie mit NA-Werten umgegangen werden soll.

Die folgenden Beispiele veranschaulichen diese Unterschiede in der Praxis.

Beispiel 1: if_else() prüft, ob die beiden Alternativen den gleichen Typ haben

Angenommen, wir haben den folgenden Datenrahmen in R, der Informationen über verschiedene Basketballspieler enthält:

 #create data frame
df <- data. frame (team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'),
                 points=c(22, 20, 28, 14, 13, 18, 27, 33))

#view data frame
df

  team points
1 to 22
2 to 20
3 to 28
4 to 14
5 B 13
6 B 18
7 B 27
8 B 33

Wenn wir die R-Basisfunktion ifelse() verwenden, um eine neue Spalte zu erstellen, die Zeilen mit einem Teamwert von „A“ den Wert „Atlanta“ und Zeilen mit einem anderen Wert 0 zuweist, erhalten wir keine Fehlermeldungen. obwohl „Atlanta“ ein Zeichen und 0 eine Zahl ist:

 #create new column based on values in team column
df$city <- ifelse(df$team == ' A ', ' Atlanta ', 0)

#view updated data frame
df

  team points city
1 to 22 Atlanta
2 to 20 Atlanta
3 to 28 Atlanta
4 A 14 Atlanta
5 B 13 0
6 B 18 0
7 B 27 0
8 B 33 0

Wenn wir jedoch die if_else() -Funktion von dplyr verwenden, um dieselbe Aufgabe auszuführen, erhalten wir eine Fehlermeldung, die uns mitteilt, dass wir in der if else-Anweisung zwei verschiedene Datentypen verwendet haben:

 library (dplyr)

#attempt to create new column based on values in team column
df$city <- if_else(df$team == ' A ', ' Atlanta ', 0)

Error: `false` must be a character vector, not a double vector.

Beispiel 2: if_else() konvertiert keine Datumsobjekte in numerische Werte

Angenommen, wir haben den folgenden Datenrahmen in R, der die Verkäufe zeigt, die zu verschiedenen Terminen in einem Geschäft getätigt wurden:

 #create data frame
df <- data. frame (date=as. Date (c('2022-01-05', '2022-01-17', '2022-01-22',
                        '2022-01-23', '2022-01-29', '2022-02-13')),
                 sales=c(22, 35, 24, 20, 16, 19))

#view data frame
df

        dirty date
1 2022-01-05 22
2 2022-01-17 35
3 2022-01-22 24
4 2022-01-23 20
5 2022-01-29 16
6 2022-02-13 19

Wenn wir die R-Basisfunktion ifelse() verwenden, um die Werte der Datumsspalte zu ändern, werden die Werte automatisch in numerische Werte konvertiert:

 #if date is before 2022-01-20 then add 5 days
df$date <- ifelse(df$date < ' 2022-01-20 ', df$date+ 5 , df$date)

   dirty date
1 19002 22
2 19014 35
3 19014 24
4 19015 20
5 19021 16
6 19036 19

Wenn wir jedoch die Funktion if_else() von dplyr verwenden, bleiben die Datumsobjekte als Datumsangaben erhalten:

 library (dplyr)

#if date is before 2022-01-20 then add 5 days
df$date <- ifelse(df$date < ' 2022-01-20 ', df$date+ 5 , df$date)

#view updated data frame
df

        dirty date
1 2022-01-10 22
2 2022-01-22 35
3 2022-01-22 24
4 2022-01-23 20
5 2022-01-29 16
6 2022-02-13 19

Beispiel 3: if_else() bietet ein „fehlendes“ Argument, um anzugeben, wie mit NA-Werten umgegangen werden soll

Angenommen, wir haben den folgenden Datenrahmen in R:

 #create data frame
df <- data. frame (team=c('A', 'A', 'A', 'A', 'B', 'B', NA, 'B'),
                 points=c(22, 20, 28, 14, 13, 18, 27, 33))

#view data frame
df

  team points
1 to 22
2 to 20
3 to 28
4 to 14
5 B 13
6 B 18
7 <NA> 27
8 B 33

Wenn wir die R-Basisfunktion ifelse() verwenden, um eine neue Spalte zu erstellen, gibt es keine Standardoption, um anzugeben, wie mit NA-Werten umgegangen wird:

 #create new column based on values in team column
df$city <- ifelse(df$team == ' A ', ' Atlanta ', ' Boston ')

#view updated data frame
df

  team points city
1 to 22 Atlanta
2 to 20 Atlanta
3 to 28 Atlanta
4 A 14 Atlanta
5 B 13 Boston
6 B 18 Boston
7 <NA> 27 <NA>
8 B 33 Boston

Wenn wir jedoch die if_else() -Funktion von dplyr verwenden, können wir das fehlende Argument verwenden, um anzugeben, wie mit NA-Werten umgegangen wird:

 library (dplyr)

#create new column based on values in team column
df$city <- ifelse(df$team == ' A ', ' Atlanta ', ' Boston ', missing=' other ')

#view updated data frame
df

  team points city
1 to 22 Atlanta
2 to 20 Atlanta
3 to 28 Atlanta
4 A 14 Atlanta
5 B 13 Boston
6 B 18 Boston
7 <NA> 27 other
8 B 33 Boston

Beachten Sie, dass die Zeile mit einem NA-Wert in der Teamspalte den Wert „andere“ in der neuen Stadtspalte erhält.

Zusätzliche Ressourcen

In den folgenden Tutorials wird erläutert, wie Sie andere häufige Aufgaben in R ausführen:

So verwenden Sie die If-Anweisung mit mehreren Bedingungen in R
So schreiben Sie eine verschachtelte If Else-Anweisung in R
So schreiben Sie Ihre erste tryCatch()-Funktion in R

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert