163  食中毒データの加工2

library(tidyverse)
library(readxl)

dat_a <- read_excel("data/food_poisoning2020.xls",
                    range = "A3:W36",
                    col_names = FALSE,
                    sheet="④病因物質別発生状況")

dat_b <- read_excel("data/food_poisoning2020.xls",
                    range = "A39:T72",
                    col_names = FALSE,
                    sheet="④病因物質別発生状況")

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 != "総数")

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 != "総数")

ひとつ前の動画で作成した二つのデータ、結合しましょう。

ここでの結合は二つのデータの列同士を結合するやり方になり、join系の関数を利用しません。

join系の関数は、

A <- A B <- B C <- C

こうですが、

ここで行いたい結合は、

A B C A B C

という縦方向の結合です。この結合を行うのは、

test1 <- tibble(A = c(1:3), B = c(11:13))
test2 <- tibble(A = c(4:6), B = c(14:16))

test1
# A tibble: 3 × 2
      A     B
  <int> <int>
1     1    11
2     2    12
3     3    13
test2
# A tibble: 3 × 2
      A     B
  <int> <int>
1     4    14
2     5    15
3     6    16
bind_rows(test1, test2)
# A tibble: 6 × 2
      A     B
  <int> <int>
1     1    11
2     2    12
3     3    13
4     4    14
5     5    15
6     6    16

この、bind_rows関数です。

ということで、

dat_fin <- bind_rows(dat_a2, dat_b2)

View(dat_fin)

くっつきました。

後は、cause_1とcause_2の余分な空白、

dat_fin$cause_1 %>% unique()
[1] "細                 菌" 
[2] "ウ     イ     ル     ス" 
[3] "寄          生         虫"
[4] "自          然         毒"
dat_fin$cause_2 %>% unique()
 [1] "サ ル モ ネ ラ 属 菌"         "ぶ  ど  う  球  菌"        
 [3] "ボ ツ リ ヌ ス 菌"             "腸 炎 ビ ブ リ オ"            
 [5] "腸管出血性大腸菌(VT産生)"       "その他の病原大腸菌"                
 [7] "ウ エ ル シ ュ 菌"             "セ  レ  ウ  ス  菌"        
 [9] "エルシニア・エンテロコリチカ"       "カンピロバクター・ジェジュニ/コリ"
[11] "ナ グ ビ ブ リ オ"             "コ  レ  ラ  菌"              
[13] "赤    痢    菌"             "チ  フ  ス  菌"              
[15] "パ ラ チ フ ス A 菌"               "そ の 他 の 細 菌"                 
[17] "ノ ロ ウ イ ル ス"             "その他のウイルス"                  
[19] "ク   ド   ア"                 "サルコシスティス"                  
[21] "ア ニ サ キ ス"                 "その他の寄生虫"                    
[23] "植 物 性 自 然 毒"             "動 物 性 自 然 毒"            

を削除しておきましょう。

str_view_all( unique(dat_fin$cause_1), " ")
Warning: `str_view()` was deprecated in stringr 1.5.0.
ℹ Please use `str_view_all()` instead.
[1] │ 細<{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}>菌
[2] │ ウ<{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}>イ<{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}>ル<{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}>ス
[3] │ 寄<{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}>   生  <{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}>虫
[4] │ 自<{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}>   然  <{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}><{\u3000}>毒
str_view_all( unique(dat_fin$cause_2), " ")
 [1] │ サ<{\u3000}>ル<{\u3000}>モ<{\u3000}>ネ<{\u3000}>ラ<{\u3000}>属<{\u3000}>菌
 [2] │ ぶ<{\u3000}><{\u3000}>ど<{\u3000}><{\u3000}>う<{\u3000}><{\u3000}>球<{\u3000}><{\u3000}>菌
 [3] │ ボ<{\u3000}>ツ<{\u3000}>リ<{\u3000}>ヌ<{\u3000}>ス<{\u3000}>菌
 [4] │ 腸<{\u3000}>炎<{\u3000}>ビ<{\u3000}>ブ<{\u3000}>リ<{\u3000}>オ
 [5] │ 腸管出血性大腸菌(VT産生)
 [6] │ その他の病原大腸菌
 [7] │ ウ<{\u3000}>エ<{\u3000}>ル<{\u3000}>シ<{\u3000}>ュ<{\u3000}>菌
 [8] │ セ<{\u3000}><{\u3000}>レ<{\u3000}><{\u3000}>ウ<{\u3000}><{\u3000}>ス<{\u3000}><{\u3000}>菌
 [9] │ エルシニア・エンテロコリチカ
[10] │ カンピロバクター・ジェジュニ/コリ
[11] │ ナ<{\u3000}>グ<{\u3000}>ビ<{\u3000}>ブ<{\u3000}>リ<{\u3000}>オ
[12] │ コ<{\u3000}><{\u3000}>レ<{\u3000}><{\u3000}>ラ<{\u3000}><{\u3000}>菌
[13] │ 赤<{\u3000}><{\u3000}><{\u3000}><{\u3000}>痢<{\u3000}><{\u3000}><{\u3000}><{\u3000}>菌
[14] │ チ<{\u3000}><{\u3000}>フ<{\u3000}><{\u3000}>ス<{\u3000}><{\u3000}>菌
[15] │ パ ラ チ フ ス A 菌
[16] │ そ の 他 の 細 菌
[17] │ ノ<{\u3000}>ロ<{\u3000}>ウ<{\u3000}>イ<{\u3000}>ル<{\u3000}>ス
[18] │ その他のウイルス
[19] │ ク<{\u3000}><{\u3000}><{\u3000}>ド<{\u3000}><{\u3000}><{\u3000}>ア
[20] │ サルコシスティス
... and 4 more
dat_fin <- dat_fin %>% 
  mutate(
    cause_1 = str_remove_all(cause_1," "),
    cause_2 = str_remove_all(cause_2," ")
  )

また、valは、「-」が欠損値として利用されているので置き換えておきましょう。

dat_fin <- dat_fin %>% 
  mutate(val = na_if(val,"-")) %>% 
  mutate(val = as.numeric(val))

View(dat_fin)

以上!キレイな形になりました。

グラフ化してみましょう。

gdat <- dat_fin %>% 
  filter(cause_2 == "ノロウイルス") 

ggplot(gdat) + 
  geom_col(aes(x = month, y = val)) +
  facet_wrap(~type)
Warning: Removed 18 rows containing missing values (`position_stack()`).

monthの並びが10月、11月、12月、1月と並んでいるのでここの並びを整えましょう。

因子型にすると並びを調整することが可能です。

month_label <- c("1月","2月","3月","4月","5月","6月",
                 "7月","8月","9月","10月","11月","12月")

dat_fin <- dat_fin %>% 
  mutate(month = factor(month,
                        levels=month_label,
                        labels=month_label))

gdat <- dat_fin %>% 
  filter(cause_2 == "ノロウイルス") 

ggplot(gdat) + 
  geom_col(aes(x = month, y = val)) +
  facet_wrap(~type)
Warning: Removed 18 rows containing missing values (`position_stack()`).

うまくならびましたね!

以上、実際のデータをインポート、加工してグラフ化する一連の流れをみてみました。

解説しながらなので、スクリプト量が多く感じるかもしれませんが、後から解説する「関数化」を利用すれば、同じ形のデータを1行で処理できたりするので、引き続きお付き合いください。

おつかれさまでした。

ここまでの加工ができるようになれば、思いどおりにデータの形を変形することができるようになっているはずです。データのインポート、可視化、データ加工の3つの手順をストレスなくできるようになれば、あなたが行いたいデータ分析はほぼ8割が終了しているという格言もあったりします。

残りのセクションで、   * データの集計を行う方法 * 分析結果を共有するときに有用なレポート作成

の知識をお伝えいたします。