一:ifelse()和if_else()的区别


dplyr if_else()函数比 R 基ifelse()函数具有三个优点:

1. if_else()函数检查 if else 语句中的两个替代项是否具有相同的数据类型。

2. if_else()函数不会将Date对象转换为数值。

3. if_else()函数提供了一个“缺失”参数来指定如何处理 NA 值。

以下示例说明了实践中的这些差异。

示例 1:if_else() 检查两个替代项是否具有相同的类型

假设我们在 R 中有以下数据框,其中包含有关各种篮球运动员的信息:

 #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

如果我们使用 R 基ifelse()函数创建一个新列,将值“Atlanta”分配给团队值为“A”的行,并将 0 分配给具有不同值的行,我们将不会收到任何错误。即使“Atlanta”是一个字符而 0 是一个数字:

 #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

但是,如果我们使用 dplyr 的if_else()函数来执行相同的任务,我们将收到一个错误,告诉我们在 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.

示例 2:if_else() 不将日期对象转换为数值

假设我们在 R 中有以下数据框,显示商店中不同日期的销售额:

 #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

如果我们使用 R 基ifelse()函数修改日期列的值,这些值将自动转换为数字:

 #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

但是,如果我们使用 dplyr 的if_else()函数,日期对象将保留为日期:

 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

示例 3:if_else() 提供“缺失”参数来指定如何处理 NA 值

假设我们在 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

如果我们使用 R 基ifelse()函数创建一个新列,则没有默认选项来指定如何处理 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

但是,如果我们使用 dplyr 的if_else()函数,那么我们可以使用缺少的参数来指定如何处理 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

请注意,团队列中具有 NA 值的行在新城市中接收值“other”。

其他资源

以下教程解释了如何在 R 中执行其他常见任务:

如何在 R 中使用具有多个条件的 If 语句
如何在 R 中编写嵌套的 If Else 语句
如何在 R 中编写第一个 tryCatch() 函数

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注