library(tidyverse)ここでは、保険証番号からデータを生成するようなことを行っていきましょう。
尚、ここで利用しているデータは、
の疑似個人情報生成サービスのデータを利用しているもので、実際データは利用していません。
この練習問題では、data/join.xlsxファイルを利用します。
問題1:
ファイルには、
- data
- todouhuken
- houbetu
と名前の付いた3種類のシートが含まれています。
それぞれ、dat, pref, houという名前をつけてインポートしてください。
問題2
datデータのidコラムには7桁の数字が文字列として保存されています。
(実際のものとは少し違いますが、)このidは保険証の番号で、
- 最初の2桁:保険の種類
- 次の2桁:都道府県
- 最後の3桁:保険者番号
となっています。
このid列を、
- 最初の2桁:保険の種類 列名:type
- 次の2桁:都道府県 列名:pref
- 最後の3桁:保険者番号 列名:hoken の3つの列に分割してください。
問題3
type列の値を利用して問題1で読み込んだhouデータと結合してください。
問題4
pref列の値を利用して、問題1で読み込んだprefデータと結合してください。
問題1:ファイルには、
- data
- todouhuken
- houbetu
と名前の付いた3種類のシートが含まれています。
それぞれ、dat, pref, houという名前をつけてインポートしてください。
library(tidyverse)
library(readxl)
dat <- read_excel("data/join.xlsx",sheet="data")
pref <- read_excel("data/join.xlsx",sheet="todouhuken")
hou <- read_excel("data/join.xlsx",sheet="houbetu")問題2
datデータのidコラムには7桁の数字が文字列として保存されています。
(実際のものとは少し違いますが、)このidは保険証の番号で、
- 最初の2桁:保険の種類
- 次の2桁:都道府県
- 最後の3桁:保険者番号
となっています。 このid列を、
- 最初の2桁:保険の種類 列名:type
- 次の2桁:都道府県 列名:pref
- 最後の3桁:保険者番号 列名:hoken の3つの列に分割してください。
この3つの列への分割ですが、separateを使うのであれば、
dat2 <- dat %>%
separate(id,
c("type","pref","hoken"),
sep=c(2,4))
dat2# A tibble: 100 × 5
name gender type pref hoken
<chr> <chr> <chr> <chr> <chr>
1 オオシマミチオ 男 74 37 872
2 ナガハマアツモリ 男 06 08 193
3 キドタツヤ 男 33 47 192
4 コウベルカ 女 73 46 223
5 カノリオ 女 06 11 353
6 ヒラハラテツオ 男 07 42 234
7 ウメザワカホ 女 32 25 211
8 アカイタキ 女 06 33 608
9 イモトタカフミ 男 02 06 550
10 コヤナギヒロヒサ 男 39 14 331
# ℹ 90 more rows
あるいは、extractを使うのであれば、
dat2 <- dat %>%
extract(id,
c("type","pref","hoken"),
regex="(.{2})(.{2})(.{3})")
dat2# A tibble: 100 × 5
name gender type pref hoken
<chr> <chr> <chr> <chr> <chr>
1 オオシマミチオ 男 74 37 872
2 ナガハマアツモリ 男 06 08 193
3 キドタツヤ 男 33 47 192
4 コウベルカ 女 73 46 223
5 カノリオ 女 06 11 353
6 ヒラハラテツオ 男 07 42 234
7 ウメザワカホ 女 32 25 211
8 アカイタキ 女 06 33 608
9 イモトタカフミ 男 02 06 550
10 コヤナギヒロヒサ 男 39 14 331
# ℹ 90 more rows
となります。もちろん、mutateとstr_extractを利用してもOKです。
問題3
type列の値を利用して問題1で読み込んだhouデータと結合してください。
hou# A tibble: 17 × 3
法別番号 医療保険の分類 医療保険の名称
<chr> <chr> <chr>
1 01 社会保険 全国健康保険協会管掌健康保険(協会けんぽ)
2 02 社会保険 船員保険
3 03 社会保険 日雇特例被保険者の保険(一般療養)
4 04 社会保険 日雇特例被保険者の保険(特別療養費)
5 06 社会保険 組合管掌健康保険
6 07 社会保険 防衛省職員給与法による自衛官等の療養の給付
7 31 社会保険 国家公務員共済組合
8 32 社会保険 地方公務員等共済組合
9 33 社会保険 警察共済組合
10 34 社会保険 公立学校共済組合 日本私立学校振興・共済事業団
11 39 後期高齢者医療制度 高齢者の医療の確保に関する法律による療養の給付
12 63 社会保険 特定健康保険組合(特例退職被保険者)
13 67 国民健康保険 国民健康保険法による退職者医療
14 72 社会保険 国家公務員特定共済組合
15 73 社会保険 地方公務員等特定共済組合
16 74 社会保険 警察特定共済組合
17 75 社会保険 公立学校特定共済組合 私立学校振興・共済事業団
はこんな感じのデータです。
結合したいのは法別番号とtype列の値ですね?
dat3 <- dat2 %>%
left_join(hou, by=c("type"="法別番号"))問題4
pref列の値を利用して、問題1で読み込んだprefデータと結合してください。
こっちは、
dat3# A tibble: 100 × 7
name gender type pref hoken 医療保険の分類 医療保険の名称
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 オオシマミチオ 男 74 37 872 社会保険 警察特定共済組合
2 ナガハマアツモリ 男 06 08 193 社会保険 組合管掌健康保険
3 キドタツヤ 男 33 47 192 社会保険 警察共済組合
4 コウベルカ 女 73 46 223 社会保険 地方公務員等特…
5 カノリオ 女 06 11 353 社会保険 組合管掌健康保険
6 ヒラハラテツオ 男 07 42 234 社会保険 防衛省職員給与…
7 ウメザワカホ 女 32 25 211 社会保険 地方公務員等共…
8 アカイタキ 女 06 33 608 社会保険 組合管掌健康保険
9 イモトタカフミ 男 02 06 550 社会保険 船員保険
10 コヤナギヒロヒサ 男 39 14 331 後期高齢者医療制度 高齢者の医療の…
# ℹ 90 more rows
pref# A tibble: 47 × 2
id prefecture
<dbl> <chr>
1 1 北海道
2 2 青森県
3 3 岩手県
4 4 宮城県
5 5 秋田県
6 6 山形県
7 7 福島県
8 8 茨城県
9 9 栃木県
10 10 群馬県
# ℹ 37 more rows
dat3 %>%
left_join(pref, by=c("pref"="id"))Error in `left_join()`:
! Can't join `x$pref` with `y$id` due to incompatible types.
ℹ `x$pref` is a <character>.
ℹ `y$id` is a <double>.
とやりませんでしたか?
エラーが生じています。
実は、結合するためのカギとなる、byに与える列の型が一致している必要があります。
str(dat3) #prefは文字列型tibble [100 × 7] (S3: tbl_df/tbl/data.frame)
$ name : chr [1:100] "オオシマミチオ" "ナガハマアツモリ" "キドタツヤ" "コウベルカ" ...
$ gender : chr [1:100] "男" "男" "男" "女" ...
$ type : chr [1:100] "74" "06" "33" "73" ...
$ pref : chr [1:100] "37" "08" "47" "46" ...
$ hoken : chr [1:100] "872" "193" "192" "223" ...
$ 医療保険の分類: chr [1:100] "社会保険" "社会保険" "社会保険" "社会保険" ...
$ 医療保険の名称: chr [1:100] "警察特定共済組合" "組合管掌健康保険" "警察共済組合" "地方公務員等特定共済組合" ...
str(pref) #idは数値型tibble [47 × 2] (S3: tbl_df/tbl/data.frame)
$ id : num [1:47] 1 2 3 4 5 6 7 8 9 10 ...
$ prefecture: chr [1:47] "北海道" "青森県" "岩手県" "宮城県" ...
ということで変換しましょう。
どっちをどっちに変換するかなのですが、今回の場合は、
dat4 <- dat3 %>%
mutate(pref = as.numeric(pref))
dat4 <- dat4 %>%
left_join(pref, by=c("pref"="id"))
dat4# A tibble: 100 × 8
name gender type pref hoken 医療保険の分類 医療保険の名称 prefecture
<chr> <chr> <chr> <dbl> <chr> <chr> <chr> <chr>
1 オオシマミ… 男 74 37 872 社会保険 警察特定共済… 香川県
2 ナガハマア… 男 06 8 193 社会保険 組合管掌健康… 茨城県
3 キドタツヤ 男 33 47 192 社会保険 警察共済組合 沖縄県
4 コウベルカ 女 73 46 223 社会保険 地方公務員等… 鹿児島県
5 カノリオ 女 06 11 353 社会保険 組合管掌健康… 埼玉県
6 ヒラハラテ… 男 07 42 234 社会保険 防衛省職員給… 長崎県
7 ウメザワカ… 女 32 25 211 社会保険 地方公務員等… 滋賀県
8 アカイタキ 女 06 33 608 社会保険 組合管掌健康… 岡山県
9 イモトタカ… 男 02 6 550 社会保険 船員保険 山形県
10 コヤナギヒ… 男 39 14 331 後期高齢者医… 高齢者の医療… 神奈川県
# ℹ 90 more rows
とした場合楽です。
実は、dat3のpref列、1桁の数字が、01 02 03 のように0始まりで必ず2桁になるようになっているため、
pref2 <- pref %>%
mutate(id = as.character(id))
dat4_ng <- dat3 %>%
left_join(pref2, by=c("pref"="id"))
View(dat4_ng)06と6が違う文字列であると認識されてところどころ欠損が発生してしまいます。こういう場合は、
formatC(6,width=2,flag="0")[1] "06"
formatC(6,width=4,flag="0")[1] "0006"
で幅を指定した文字列で桁が足らない場合に0で埋めるような関数があるので、as.characterではなく、
pref3 <- pref %>%
mutate(id = formatC(id, width=2, flag="0"))
dat4_ok <- dat3 %>%
left_join(pref3, by=c("pref"="id"))
View(dat4_ok)いけました!
これでtypeとpref列は必要ないので、
dat4 %>%
select(!c(type, pref))# A tibble: 100 × 6
name gender hoken 医療保険の分類 医療保険の名称 prefecture
<chr> <chr> <chr> <chr> <chr> <chr>
1 オオシマミチオ 男 872 社会保険 警察特定共済組合 香川県
2 ナガハマアツモリ 男 193 社会保険 組合管掌健康保険 茨城県
3 キドタツヤ 男 192 社会保険 警察共済組合 沖縄県
4 コウベルカ 女 223 社会保険 地方公務員等特定… 鹿児島県
5 カノリオ 女 353 社会保険 組合管掌健康保険 埼玉県
6 ヒラハラテツオ 男 234 社会保険 防衛省職員給与法… 長崎県
7 ウメザワカホ 女 211 社会保険 地方公務員等共済… 滋賀県
8 アカイタキ 女 608 社会保険 組合管掌健康保険 岡山県
9 イモトタカフミ 男 550 社会保険 船員保険 山形県
10 コヤナギヒロヒサ 男 331 後期高齢者医療制度 高齢者の医療の確… 神奈川県
# ℹ 90 more rows
が完成形となります。
お疲れさまでした! これでセクション5の解説部分、すべて終了です。残りは、練習用に準備したデータを加工してTidyなデータにしていくところを、やっていってみましょう。