R: a diferença entre ifelse() e if_else()


A função dplyr if_else() tem três vantagens sobre a função R base ifelse() :

1. A função if_else() verifica se as duas alternativas na instrução if else têm o mesmo tipo de dados.

2. A função if_else() não converte objetos Date em numéricos.

3. A função if_else() oferece um argumento “ausente” para especificar como lidar com valores NA.

Os exemplos a seguir ilustram essas diferenças na prática.

Exemplo 1: if_else() verifica se as duas alternativas têm o mesmo tipo

Suponha que temos o seguinte quadro de dados em R que contém informações sobre vários jogadores de basquete:

 #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

Se usarmos a função R base ifelse() para criar uma nova coluna que atribui o valor “Atlanta” às linhas com valor de equipe “A” e 0 às linhas com valor diferente, não receberemos nenhum erro. mesmo que “Atlanta” seja um caractere e 0 seja um número:

 #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

No entanto, se usarmos a função if_else() do dplyr para realizar esta mesma tarefa, receberemos um erro que nos informa que usamos dois tipos de dados diferentes na instrução if else:

 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.

Exemplo 2: if_else() não converte objetos de data em valores numéricos

Suponha que temos o seguinte quadro de dados em R que mostra as vendas realizadas em datas diferentes em uma loja:

 #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

Se usarmos a função R base ifelse() para modificar os valores da coluna de data, os valores serão automaticamente convertidos para numéricos:

 #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

No entanto, se usarmos a função if_else() do dplyr, os objetos de data permanecerão como datas:

 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

Exemplo 3: if_else() oferece um argumento “ausente” para especificar como lidar com valores NA

Suponha que temos o seguinte quadro de dados em 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

Se usarmos a função R base ifelse() para criar uma nova coluna, não há opção padrão para especificar como lidar com valores NA:

 #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

No entanto, se usarmos a função if_else() do dplyr, podemos usar o argumento ausente para especificar como lidar com os valores NA:

 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

Observe que a linha com valor NA na coluna equipe recebe o valor “outro” na nova coluna cidade.

Recursos adicionais

Os tutoriais a seguir explicam como realizar outras tarefas comuns em R:

Como usar a instrução If com múltiplas condições em R
Como escrever uma instrução If Else aninhada em R
Como escrever sua primeira função tryCatch() em R

Add a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *