A: ifelse() と if_else() の違い


dplyr if_else()関数には、R ベースのifelse()関数に比べて 3 つの利点があります。

1. if_else()関数は、if else ステートメント内の 2 つの選択肢が同じデータ型であることを確認します。

2. if_else()関数は、Date オブジェクトを数値に変換しません。

3. if_else()関数は、NA 値の処理方法を指定する「欠落している」引数を提供します。

次の例は、実際のこれらの違いを示しています。

例 1: if_else() は 2 つの選択肢が同じ型であることをチェックします

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()関数を使用して、チーム値が「A」の行に値「Atlanta」を割り当て、別の値の行に 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 ステートメントで 2 つの異なるデータ型を使用したことを示すエラーが発生します。

 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() 関数を作成する方法

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です