ifelse()は危険なのでやめてdplyr::if_else()を使いましょう

dplyrパッケージのif_else()case_when()recode()の紹介をuriboが書いてたので、そういえばこのことちゃんと書いてなかったなと思って書いておきます。

ifelse()がつらい話は何度かしていますが、興味ある人は以下の記事を見てください。

ifelse()を使うとclassとかattributeの情報が失われます。warningもなしに勝手に変換されます。

ifelse(TRUE, as.Date("2015-09-24"), as.Date("2015-09-25"))
#> [1] 16702

dplyrのif_else()はそんなことはありません。ちゃんと元の情報を引き継ぎます。

dplyr::if_else(TRUE, as.Date("2015-09-24"), as.Date("2015-09-25"))
#> [1] "2015-09-24"

ただし、型が違ったらエラーになる点だけ注意。型が同じものを渡す必要があります。

dplyr::if_else(TRUE, as.Date("2015-09-24"), 0)
#> Error in as.Date.numeric(value) : 'origin' must be supplied

dplyr::if_else(TRUE, as.Date("2015-09-24"), as.Date(NA))
#> [1] "2015-09-24"

dplyrのif_else()の方が明らかにいいのでこっちを使いましょう。