library(tidyverse)
library(readxl)ここでは、data/food_poisoning2020.xlsの、④病因物質別発生状況
シートからデータをインポートしてtidyデータにしていきます。
もし可能そうであれば一度解説を見る前に取り組んでみてください。なお、総数等の集計されたデータはすべて破棄する形で進めましょう。
それではいきます!
まずはデータを眺めてみます。
3-36行目に1-6月のデータ(A3:W36)
39-72行目に7-12月のデータ(A39:T72)
が含まれています。
read_excel関数のヘルプファイルを見ると、rangeアーギュメントがあり、範囲指定でデータを取得することができます。
なので、
dat_a <- read_excel("data/food_poisoning2020.xls",
range = "A3:W36",
col_names = FALSE,
sheet="④病因物質別発生状況")New names:
• `` -> `...1`
• `` -> `...2`
• `` -> `...3`
• `` -> `...4`
• `` -> `...5`
• `` -> `...6`
• `` -> `...7`
• `` -> `...8`
• `` -> `...9`
• `` -> `...10`
• `` -> `...11`
• `` -> `...12`
• `` -> `...13`
• `` -> `...14`
• `` -> `...15`
• `` -> `...16`
• `` -> `...17`
• `` -> `...18`
• `` -> `...19`
• `` -> `...20`
• `` -> `...21`
• `` -> `...22`
• `` -> `...23`
dat_b <- read_excel("data/food_poisoning2020.xls",
range = "A39:T72",
col_names = FALSE,
sheet="④病因物質別発生状況")New names:
• `` -> `...1`
• `` -> `...2`
• `` -> `...3`
• `` -> `...4`
• `` -> `...5`
• `` -> `...6`
• `` -> `...7`
• `` -> `...8`
• `` -> `...9`
• `` -> `...10`
• `` -> `...11`
• `` -> `...12`
• `` -> `...13`
• `` -> `...14`
• `` -> `...15`
• `` -> `...16`
• `` -> `...17`
• `` -> `...18`
• `` -> `...19`
• `` -> `...20`
View(dat_a)
View(dat_b)まずdat_aから処理しましょう。
1行目と2行目に列名となりうる行です。
人口動態データの処理にならって列名を作成しましょう。
row1 <- dat_a %>% slice(1) %>% as_vector()
row2 <- dat_a %>% slice(2) %>% as_vector()
col_a <- tibble(r1 = row1, r2 = row2) %>%
fill(r1, r2) %>%
replace_na(list(r2="")) %>%
unite("col_a",r1, r2, sep="_")ここでcol_aの列名が1行目と2行目で同じ値です。
データを確認すると、1行目と2行目はそれぞれ、分類1、分類2という形で分かれているとみなせるので、それを反映しておきましょう。
col_a$col_a[1] <- "cause_1"
col_a$col_a[2] <- "cause_2"
col_a# A tibble: 23 × 1
col_a
<chr>
1 cause_1
2 cause_2
3 総数_事件
4 総数_患者
5 総数_死者
6 1月_事件
7 1月_患者
8 1月_死者
9 2月_事件
10 2月_患者
# ℹ 13 more rows
dat_a2 <- dat_a %>%
setNames(col_a$col_a) %>%
slice(-c(1:2))
View(dat_a2)cause_1をまずは埋めましょう。ついで、総数を表すことになるので、cause_2が欠損している行は削除します。
dat_a3 <- dat_a2 %>%
fill(cause_1) %>%
filter(!is.na(cause_2))縦持ちに変換します。
dat_a4 <- dat_a3 %>%
pivot_longer(
cols = !c(cause_1, cause_2),
names_to = c("month","type"),
values_to = "val",
names_sep = "_"
)
View(dat_a4)総数を削除します
dat_a5 <- dat_a4 %>%
filter(month != "総数")
View(dat_a5)縦持ちデータに変換できました!
ここで、同じ変換を
dat_b# A tibble: 34 × 20
...1 ...2 ...3 ...4 ...5 ...6 ...7 ...8 ...9 ...10 ...11 ...12 ...13
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 病因… <NA> 7月 <NA> <NA> 8月 <NA> <NA> 9月 <NA> <NA> 10月 <NA>
2 <NA> <NA> 事件 患者 死者 事件 患者 死者 事件 患者 死者 事件 患者
3 総 … <NA> 76 492 - 72 3145 1 77 720 - 123 839
4 細 … <NA> 34 434 - 42 3103 - 37 570 - 42 618
5 <NA> サ … 4 92 - 7 137 - 5 154 - 5 116
6 <NA> ぶ … 5 71 - 6 37 - 3 46 - 1 21
7 <NA> ボ … - - - - - - - - - - -
8 <NA> 腸 … - - - 1 3 - - - - - -
9 <NA> 腸管… 1 10 - 2 4 - - - - 1 3
10 <NA> その… 1 118 - 2 2811 - 1 19 - - -
# ℹ 24 more rows
# ℹ 7 more variables: ...14 <chr>, ...15 <chr>, ...16 <chr>, ...17 <chr>,
# ...18 <chr>, ...19 <chr>, ...20 <chr>
にも適応しましょう。
練習がてら、dat_bにも適応してみてください。
dat_aの処理は、中間の変数を削除して記載すると、
row1 <- dat_a %>% slice(1) %>% as_vector()
row2 <- dat_a %>% slice(2) %>% as_vector()
col_a <- tibble(r1 = row1, r2 = row2) %>%
fill(r1, r2) %>%
replace_na(list(r2="")) %>%
unite("col_a",r1, r2, sep="_")
col_a$col_a[1] <- "cause_1"
col_a$col_a[2] <- "cause_2"
dat_a2 <- dat_a %>%
setNames(col_a$col_a) %>%
slice(-c(1:2)) %>%
fill(cause_1) %>%
filter(!is.na(cause_2)) %>%
pivot_longer(
cols = !c(cause_1, cause_2),
names_to = c("month","type"),
values_to = "val",
names_sep = "_"
) %>%
filter(month != "総数")こんな感じです。
これを参考にして、dat_bに適応すると、
row1 <- dat_b %>% slice(1) %>% as_vector()
row2 <- dat_b %>% slice(2) %>% as_vector()
col_b <- tibble(r1 = row1, r2 = row2) %>%
fill(r1, r2) %>%
replace_na(list(r2="")) %>%
unite("col_b",r1, r2, sep="_")
col_b$col_b[1] <- "cause_1"
col_b$col_b[2] <- "cause_2"
dat_b2 <- dat_b %>%
setNames(col_b$col_b) %>%
slice(-c(1:2)) %>%
fill(cause_1) %>%
filter(!is.na(cause_2)) %>%
pivot_longer(
cols = !c(cause_1, cause_2),
names_to = c("month","type"),
values_to = "val",
names_sep = "_"
) %>%
filter(month != "総数")
dat_a2# A tibble: 432 × 5
cause_1 cause_2 month type val
<chr> <chr> <chr> <chr> <chr>
1 細 菌 サ ル モ ネ ラ… 1月 事件 1
2 細 菌 サ ル モ ネ ラ… 1月 患者 95
3 細 菌 サ ル モ ネ ラ… 1月 死者 -
4 細 菌 サ ル モ ネ ラ… 2月 事件 -
5 細 菌 サ ル モ ネ ラ… 2月 患者 -
6 細 菌 サ ル モ ネ ラ… 2月 死者 -
7 細 菌 サ ル モ ネ ラ… 3月 事件 -
8 細 菌 サ ル モ ネ ラ… 3月 患者 -
9 細 菌 サ ル モ ネ ラ… 3月 死者 -
10 細 菌 サ ル モ ネ ラ… 4月 事件 -
# ℹ 422 more rows
dat_b2# A tibble: 432 × 5
cause_1 cause_2 month type val
<chr> <chr> <chr> <chr> <chr>
1 細 菌 サ ル モ ネ ラ… 7月 事件 4
2 細 菌 サ ル モ ネ ラ… 7月 患者 92
3 細 菌 サ ル モ ネ ラ… 7月 死者 -
4 細 菌 サ ル モ ネ ラ… 8月 事件 7
5 細 菌 サ ル モ ネ ラ… 8月 患者 137
6 細 菌 サ ル モ ネ ラ… 8月 死者 -
7 細 菌 サ ル モ ネ ラ… 9月 事件 5
8 細 菌 サ ル モ ネ ラ… 9月 患者 154
9 細 菌 サ ル モ ネ ラ… 9月 死者 -
10 細 菌 サ ル モ ネ ラ… 10月 事件 5
# ℹ 422 more rows
できあがりました。 次の動画でデータを結合しましょう。