日次データの欠損を埋める tidyr::complete
tidyr::completeに関するメモ。
日次データが欠損している(ある日に一件も事象が観測されていない)場合のデータに出会すことがよくある。
> library(tidyverse) > > stopcovid19_tbl_tmp <- read_csv("https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv") > stopcovid19_tbl <- stopcovid19_tbl_tmp %>% + select("公表_年月日", "患者_年代", "患者_性別") %>% + rename(公表日 = 公表_年月日, + 年代 = 患者_年代, + 性別 = 患者_性別) > stopcovid19_tbl # A tibble: 1,116 x 3 公表日 年代 性別 <date> <chr> <chr> 1 2020-01-24 40代 男性 2 2020-01-25 30代 女性 3 2020-01-30 30代 女性 4 2020-02-13 70代 男性 5 2020-02-14 50代 女性 6 2020-02-14 70代 男性 7 2020-02-15 80代 男性 8 2020-02-15 50代 女性 9 2020-02-15 50代 男性 10 2020-02-15 70代 男性 # … with 1,106 more rows
何かと時系列で日次でデータがしっかり埋まっていて欲しいという場合も多くある。公表日ごとにカウントした人数と累積人数のデータを集計する場合には、以下のようになる。
> stopcovid19_tbl %>% + group_by(公表日) %>% + summarise(人数 = n()) %>% + complete(公表日 = seq(min(公表日), max(公表日), by = "day"), + fill = list(人数 = 0)) %>% + mutate(累積 = cumsum(人数)) # A tibble: 74 x 3 公表日 人数 累積 <date> <dbl> <dbl> 1 2020-01-24 1 1 2 2020-01-25 1 2 3 2020-01-26 0 2 4 2020-01-27 0 2 5 2020-01-28 0 2 6 2020-01-29 0 2 7 2020-01-30 1 3 8 2020-01-31 0 3 9 2020-02-01 0 3 10 2020-02-02 0 3 # … with 64 more rows
さらに、ここで、公表日、年代、性別ごとのように、複数の変数ごとにカウントした人数と累積人数を集計するには、以下のようになる。
> stopcovid19_tbl %>% + group_by(公表日, 年代, 性別) %>% + summarise(人数 = n()) %>% + ungroup() %>% + complete(公表日 = seq(min(公表日), max(公表日), by = "day"), + fill = list(人数 = 0)) %>% + mutate(累積 = cumsum(人数)) # A tibble: 339 x 5 公表日 年代 性別 人数 累積 <date> <chr> <chr> <dbl> <dbl> 1 2020-01-24 40代 男性 1 1 2 2020-01-25 30代 女性 1 2 3 2020-01-26 NA NA 0 2 4 2020-01-27 NA NA 0 2 5 2020-01-28 NA NA 0 2 6 2020-01-29 NA NA 0 2 7 2020-01-30 30代 女性 1 3 8 2020-01-31 NA NA 0 3 9 2020-02-01 NA NA 0 3 10 2020-02-02 NA NA 0 3 # … with 329 more rows
この場合は、しっかりungroupを入れることが必要となる。