case_when - 条件によって異なる値を返すための方法

ある列の値に応じて異なる結果を返し、それを新しい列として作成する方法について見てみましょう。

例えばProduct Name(製品名)という列があり、製品名の中に“Phone” が含まれていたら”電話”、“Microwave”が含まれていたら”家電”、それ以外は”その他”とラベル付けして新しい列にしたいとします。

Product Name(製品名)の列ヘッダメニューより、データを置換 / 変換 / 埋めるを選択し、条件によって既存の値を置き換えるを選びます。

すると以下のような計算式が既に入力された形で、計算の作成のダイアログが開きます。

このデフォルトで入力されている計算式はcase_whenという関数を使っており、この関数には以下のように条件と条件が満たされた際の値のペアを“~”で繋いだものを渡します。

条件1 ~ 条件1が満たされたときの値,
条件2 ~ 条件2が満たされたときの値,
...

ちなみに、デフォルトで埋まっているスクリプトの意味は、 `Product Name` == “A” という条件(製品名がA)が満たされるときに、 “Aのときの結果”`Prodct Name` == “B”という条件(製品名がB)が満たされるときに、“Bのときの結果”、一番最後の条件はTRUEなので、上記2つが満たされないときはいつでも、“どちらでもないときの結果”を返すというものです。

今回やりたいのは、製品名の中に“Phone”が含まれているかどうか、“Microwave”が含まれているかどうかによって値を変えるというものです。

製品名に“Phone”が含まれるという条件は、あるテキストに指定した文字が含まれているかを判定できるstr_detectという関数を使って以下のように書くことができます。

str_detect(`Product Name` , "Phone")

同じく製品名に“Microwave”が含まれるているという条件は

str_detect(`Product Name` , "Microwave")

と書くことができます。ではこれを先程説明したシンタックスに合わせて、条件とその条件のときの値のペアとして組み込んでみると、以下のように記述できます。

case_when(
   str_detect(`Product Name` , "Phone") ~ "電話",
   str_detect(`Product Name` , "Microwave") ~ "家電",
   TRUE ~ "その他"
)

ダイアログに式を入力したら実行ボタンをクリックします。

すると、指定した条件で値が新しく入った列が作成されます。