1. ホーム
  2. r

[解決済み】ifelse()でDateオブジェクトがnumericオブジェクトにならないようにする方法

2022-04-13 15:57:50

質問

私は、関数 ifelse() を使用して、日付ベクトルを操作しています。私は、結果がクラス Date を取得し、驚きました。 numeric ベクトルに置き換えます。 以下はその例です。

dates <- as.Date(c('2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'))
dates <- ifelse(dates == '2011-01-01', dates - 1, dates)
str(dates)

これは特に驚くべきことで、ベクトル全体に対してこの操作を実行すると Date オブジェクトを作成します。

dates <- as.Date(c('2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04','2011-01-05'))
dates <- dates - 1
str(dates)

を操作するために何か他の関数を使うべきでしょうか? Date ベクターは?もしそうなら、どんな関数ですか? そうでない場合、どのようにすれば ifelse は入力と同じ型のベクトルを返すのですか?

のヘルプページでは ifelse は、これはバグではなく機能であることを示していますが、私が見つけた驚くべき動作の説明を見つけるのに苦労しています。

解決方法は?

を使用することができます。 data.table::fifelse ( data.table >= 1.12.3 ) または dplyr::if_else .


data.table::fifelse

<ブロッククオート

とは異なり ifelse , fifelse は、入力の型とクラスを保持します。

library(data.table)
dates <- fifelse(dates == '2011-01-01', dates - 1, dates)
str(dates)
# Date[1:5], format: "2010-12-31" "2011-01-02" "2011-01-03" "2011-01-04" "2011-01-05"


dplyr::if_else

から dplyr 0.5.0 リリースノート :

[ if_else は、より厳格なセマンティクスを持っています。 ifelse() を使用します。 truefalse の引数は同じ型でなければなりません。これにより、戻り値の型に驚かなくなり、以下のようなS3ベクトルが維持されます。 日付 となります。

library(dplyr)
dates <- if_else(dates == '2011-01-01', dates - 1, dates)
str(dates)
# Date[1:5], format: "2010-12-31" "2011-01-02" "2011-01-03" "2011-01-04" "2011-01-05"