lubridate::rollbackの使い所
日次データが存在して、その日次データとそれを月ごとにまとめ上げた月次データの可視化を行いたい場合があります。
library(tidyverse) library(lubridate) set.seed(12345) order_tbl <- tibble( order_date = seq(ymd("2018-01-01"), ymd("2018-12-31"), by = "1 day"), order_num = rpois(365, 5) )
日次データとしてプロットしたい場合は、以下のようにできます。
order_tbl %>% ggplot(aes(x = order_date, y = order_num)) + geom_point(size = 2, colour = "blue") + geom_line(size = 1, colour = "blue", alpha = 0.5) + scale_x_date(date_breaks = "3 months", date_minor_breaks = "1 months", date_labels = "%Y-%m") + scale_y_continuous(breaks = seq(0, 20, by = 2), minor_breaks = 1:20) + theme(axis.text = element_text(size = 15), axis.title = element_text(size = 20))
次に、月ごとにまとめ上げたデータは以下のように計算できます (年と月のまとめ上げでも可能)。
order_tbl %>% mutate(y = year(order_date), m = month(order_date), ym = str_c(y, "-", sprintf("%02d", m))) %>% group_by(ym) %>% summarise(monthly_order_sum = sum(order_num)) #> # A tibble: 12 x 2 #> ym monthly_order_sum #> <chr> <int> #> 1 2018-01 161 #> 2 2018-02 133 #> 3 2018-03 161 #> 4 2018-04 163 #> 5 2018-05 176 #> 6 2018-06 171 #> 7 2018-07 156 #> 8 2018-08 169 #> 9 2018-09 161 #> 10 2018-10 144 #> 11 2018-11 146 #> 12 2018-12 170
しかし、これだと年月を表すカラムがcharactor型のため、上記の日次データを可視化した際に利用したscale_x_date
の部分を流用して同じスケールで可視化できません。
そこで、lubridate::rollback
を利用すれば、以下のようにできます。
order_tbl %>% mutate(first_date = rollback(order_date, roll_to_first = TRUE)) %>% group_by(first_date) %>% summarise(monthly_order_sum = sum(order_num)) %>% ggplot(aes(x = first_date, y = monthly_order_sum)) + geom_point(size = 2, colour = "blue") + geom_line(size = 1, colour = "blue", alpha = 0.5) + scale_x_date(date_breaks = "3 months", date_minor_breaks = "1 months", date_labels = "%Y-%m") + scale_y_continuous(breaks = seq(0, 200, by = 10), minor_breaks = seq(0, 200, by = 5)) + theme(axis.text = element_text(size = 15), axis.title = element_text(size = 20))
ここでは、その月の最初の日のカラムを追加して、その日で月次にまとめ上げて可視化しています。こうすることで、日次データで利用したscale_x_date
の部分も流用できます。
rollback
関数の中身自体は、day
関数を使って、日付部分に1を入れるというシンプルな操作を行う便利関数になっています。
github.com