論理の流刑地

地獄の底を、爆笑しながら闊歩する

【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:ちゃんと読んでなかった