A: het verschil tussen ifelse() en if_else()


De dplyr if_else() functie heeft drie voordelen ten opzichte van de R base ifelse() functie:

1. De functie if_else() controleert of de twee alternatieven in de if else-instructie hetzelfde gegevenstype hebben.

2. De functie if_else() converteert Date-objecten niet naar numeriek.

3. De functie if_else() biedt een „ontbrekend“ argument om te specificeren hoe NA-waarden moeten worden verwerkt.

De volgende voorbeelden illustreren deze verschillen in de praktijk.

Voorbeeld 1: if_else() controleert of de twee alternatieven van hetzelfde type zijn

Stel dat we het volgende dataframe in R hebben dat informatie bevat over verschillende basketbalspelers:

 #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

Als we de functie R base ifelse() gebruiken om een nieuwe kolom te maken die de waarde ‚Atlanta‘ toewijst aan rijen met een teamwaarde ‚A‘ en 0 aan rijen met een andere waarde, krijgen we geen fouten. ook al is “Atlanta” een teken en 0 een getal:

 #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

Als we echter de if_else() -functie van dplyr gebruiken om dezelfde taak uit te voeren, krijgen we een foutmelding die ons vertelt dat we twee verschillende gegevenstypen hebben gebruikt in de if else-instructie:

 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.

Voorbeeld 2: if_else() converteert datumobjecten niet naar numerieke waarden

Stel dat we het volgende gegevensframe in R hebben, waarin de verkopen op verschillende data in een winkel worden weergegeven:

 #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

Als we de functie R base ifelse() gebruiken om de waarden van de datumkolom te wijzigen, worden de waarden automatisch geconverteerd naar numeriek:

 #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

Als we echter de if_else() -functie van dplyr gebruiken, blijven de datumobjecten als datums:

 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

Voorbeeld 3: if_else() biedt een „ontbrekend“ argument om te specificeren hoe NA-waarden moeten worden verwerkt

Stel dat we het volgende dataframe in R hebben:

 #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

Als we de functie R base ifelse() gebruiken om een nieuwe kolom te maken, is er geen standaardoptie om op te geven hoe NA-waarden moeten worden afgehandeld:

 #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

Als we echter de functie if_else() van dplyr gebruiken, kunnen we het ontbrekende argument gebruiken om te specificeren hoe NA-waarden moeten worden afgehandeld:

 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

Merk op dat de rij met een NA-waarde in de teamkolom de waarde „anders“ krijgt in de nieuwe stadskolom .

Aanvullende bronnen

In de volgende tutorials wordt uitgelegd hoe u andere veelvoorkomende taken in R kunt uitvoeren:

Hoe gebruik je een If-instructie met meerdere voorwaarden in R
Hoe schrijf je een geneste If Else-instructie in R
Hoe u uw eerste tryCatch()-functie schrijft in R

Einen Kommentar hinzufügen

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