2025年6月4日水曜日

Rで二つの日付の間の期間の日数を求める

 二つの期間の間の日数を求めたい時ありますよね?ADaM的にはADYの変数で定義されているようなやつです。せっかくなので流行りの{admiral}のお試しがてら期間の変数を算出します。別に{admiral}である必要はないのですが、せっかくよさげなパッケージがあるなら使ってみるのがOSSの醍醐味でしょう。

なにはともあれまずはパッケージのインポートですね。なかったらinstall.packages()してください。諸々実行して最後のオブジェクトHOGEにxxdyの変数が作成されています。便利な関数だなあ…!(ダイマ)


library(admiral)
library(dplyr)
library(lubridate) # 日付を操作するパッケージ
library(tibble) # テストデータを作るのに使用(tribble関数)

# データ作成
datain <- tribble(
  ~TRTSDTM,              ~ASTDTM,               ~AENDT,
  "2014-01-17T23:59:59", "2014-01-18T13:09:09", "2014-01-20"
) %>%
  mutate(
    TRTSDTM = as_datetime(TRTSDTM),
    ASTDTM = as_datetime(ASTDTM),
    AENDT = ymd(AENDT)
  )

head(datain)

'''
> head(datain)
# A tibble: 1 × 3
  TRTSDTM             ASTDTM              AENDT
  <dttm>              <dttm>              <date>
1 2014-01-17 23:59:59 2014-01-18 13:09:09 2014-01-20
'''

# 相対日を追加
# source_varsに期間の後端を示す変数を格納する。
# HOGEDY = TRTSDTMのようにすると、出力する期間の変数名を指定できる
# 変数名のみ指定すると期間の変数名はxxDYの形に指定される
# (個人的にはプログラム中に出力変数名が出てこないのは嫌なので変数名は指定したい)
hoge <- derive_vars_dy(
  datain,
  reference_date = TRTSDTM,
  source_vars = exprs(HOGEDY = TRTSDTM, ASTDTM, AENDT)
)

head(hoge)
'''
> head(hoge)
# A tibble: 1 × 6
  TRTSDTM             ASTDTM              AENDT      HOGEDY ASTDY AENDY
  <dttm>              <dttm>              <date>      <dbl> <dbl> <dbl>
1 2014-01-17 23:59:59 2014-01-18 13:09:09 2014-01-20      1     2     4
'''