今週も特にありません

進捗どうですか?

日次データの欠損を埋める 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を入れることが必要となる。

blog.exploratory.io

tidyr.tidyverse.org