【R備忘】dplyr::mutate内でif_elseを使ってNAを指定する時は型指定しないとErrorを吐く
なんか忘れそうなので手短な備忘。
問題
dplyr::mutate()(あるいはtransmute())をつかって、ある条件ならNA、そうでないならば他の変数(を加工した値)をとる変数を作りたい時がある。
たとえば、変数v1が1ならNA, そうでないときはv2(numeric型)をとる変数v3を作成したいとき、以下のように書くとErrorを吐く
new_df <- dplyr::mutate(old_df , v3 = if_else( v1 == 1 , NA , v2)) # Error: `false` must be a logical vector, not a double vector # ↑のようなエラーメッセージが出る。
解決法
dplyr::if_elseのhelpを読むと、第二引数(条件が真のときの値)と第三引数(条件が偽のときの値)について、以下のように書いてある*1。
They must also be the same type: if_else() checks that they have the same type and same class.
All other attributes are taken from true.
if_elseは内部で第二・第三の引数が同じtype,classであることをチェックしているのである。
なので、上記のエラーを吐くコードは以下のように書き直せばよい
new_df <- dplyr::mutate(old_df , v3 = if_else( v1 == 1 , as.numeric(NA) , v2))
as.numeric()で第二引数のNAを型指定して、第三引数と同じ型にしている
Manazashi Daydream - Yuu Sakai~
Enjoy!!
*1:ちゃんと読んでなかった