R言語で連続する日付のベクトルを作る

概要
Rの seq() 函数を用いて連続する日付のベクトルを作る方法について紹介する。

開始日と終了日とを指定する

R言語で、連続する日付のベクトルを作りたければ、seq() 函数を使えばよい [1] 。例えば、2017年12月25日から2018年1月8日までの連続する15日間の日付のベクトルは以下のようにして作ることができる。

seq(as.Date("2017-12-25"), as.Date("2018-01-08"), by = "day")
# [1] "2017-12-25" "2017-12-26" "2017-12-27" "2017-12-28" "2017-12-29"
# [6] "2017-12-30" "2017-12-31" "2018-01-01" "2018-01-02" "2018-01-03"
# [11] "2018-01-04" "2018-01-05" "2018-01-06" "2018-01-07" "2018-01-08"

要するに、1番目の引数が開始日2番目の引数が終了日になっている。開始日も終了日も Date 型にしないといけないので、as.Date() 函数をはさんでいる。そして、最後の by = "day" は要素と要素の間隔が1日であることを示している。

間隔を変える

上記では、要素と要素の間隔が1日であったが、by = "day" の部分を変えれば間隔を変えることができる。

例えば、間隔を1週間にしたければ、by = "week" とする。

seq(as.Date("2017-12-25"), as.Date("2018-01-08"), by = "week")
# [1] "2017-12-25" "2018-01-01" "2018-01-08"

間隔を表すために使える名詞としては、以下のものがある。

これらの名詞の前に数字を付けることもできる。例えば、間隔を3日にしたければ、by = "3 days" とする。

seq(as.Date("2017-12-25"), as.Date("2018-01-08"), by = "3 days")
# [1] "2017-12-25" "2017-12-28" "2017-12-31" "2018-01-03" "2018-01-06"

なお、複数形の days のかわりに、単数形の day を使っても同じ結果が得られる。

seq(as.Date("2017-12-25"), as.Date("2018-01-08"), by = "3 day")
# [1] "2017-12-25" "2017-12-28" "2017-12-31" "2018-01-03" "2018-01-06"

また、by の引数に数値を与えると、その数値を日数とみなす。つまり、by = 3 としても、間隔が3日になり、by = "3 days" と指定したのと同じになる。

seq(as.Date("2017-12-25"), as.Date("2018-01-08"), by = 3)
# [1] "2017-12-25" "2017-12-28" "2017-12-31" "2018-01-03" "2018-01-06"

開始日とできあがりのベクトルの長さとを指定する

連続する日付のベクトルを作りたければ、終了日を指定せずに、開始日とできあがりのベクトルの長さとを指定するという手もある。

例えば、2018年3月7日から連続9日間の日付のベクトルを作りたいとしよう。この場合、以下のようにして作ることができる。

seq(as.Date("2018-03-07"), by = "day", length.out = 9)
# [1] "2018-03-07" "2018-03-08" "2018-03-09" "2018-03-10" "2018-03-11"
# [6] "2018-03-12" "2018-03-13" "2018-03-14" "2018-03-15"

length.out = 9 でできあがりのベクトルの長さが9であることを指定している。そして、by = "day" で間隔が1日であることを示している。

間隔を変える

終了日を指定せずに、できあがりのベクトルの長さを指定する場合も、間隔を変えることができる。例えば、2018年1月11日からはじめて、2週間間隔で、10回分だけ続くような日付のベクトルを作りたいとしよう。この場合は以下のようにすればよい。

seq(as.Date("2018-01-11"), by = "2 weeks", length.out = 10)
# [1] "2018-01-11" "2018-01-25" "2018-02-08" "2018-02-22" "2018-03-08"
# [6] "2018-03-22" "2018-04-05" "2018-04-19" "2018-05-03" "2018-05-17"
脚注
  1. seq() はS3総称函数で、Date 型に対するS3メソッドとして seq.Date() がある。この記事での seq() 函数はどれも seq.Date() を呼び出して使っている。なお、S3や総称函数について詳しく知りたければ、『R言語徹底解説』(Hadley Wickham〔著〕、石田基広ら〔訳〕、2016年、共立出版)の7.2節を読もう。 []