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