Data handling with R

Current Status

Hiroki Matsui
2015/05/13

この資料は

諸処の事情でR を使う必要が生じた時、

コードから逃げずに戦う基礎知識(ググるための知識)を得る事を目的にした内部資料です。

そのため、網羅性や正確性を一部欠く表現があります。

正確・網羅的な情報はググる等して資料をあたる等しましょう。

本日お伝えしたいこと。

  • 前回演習の答え合わせ
  • 最近のR でデータハンドリング

演習

R を使ってデータハンドリングしてみましょう。

data1, data2, data3 を使って以下のデータを含むDPC病院に関するcsv を作りましょう。

  • 保険医療名称
  • 保険医療機関番号
  • 住所
  • 急性心筋梗塞の手術有り症例数
  • 急性心筋梗塞の手術無し症例数

演習

data1

保険医療機関一覧

  • 20110301時点医療機関一覧、医療機関加算届出一覧

data2, data3

http://www.mhlw.go.jp/bunya/iryouhoken/database/sinryo/dpc.html

  • 平成22年度DPC病院一覧(施設概要表より)
  • 平成23年度MDC05手術有無別症例数(疾患別・手術有無別・処置1有無別集計 MDC05より)

演習(ヒント)

  • data1には医科・歯科・薬局が含まれます。
  • data2にはDPC病院の医療機関コード(保健医療機関コードと本質的に同じ)と告示番号が含まれます。
  • data1の保険医療機関コードは頭2桁が都道府県番号を示します。
  • 都道府県コード一覧はこちら
x <- c("a","b","c")
y <- c("A","B","C")
paste0(x,y)
[1] "aA" "bB" "cC"

演習(ヒント)

  • data3は、患者数0の病院が"-“になっている。これだと、集計が出来ない。
x <- c("1","2","3","-")
x <- as.numeric(x)
x[is.na(x)] <- 0
x 
[1] 1 2 3 0
fun_chr_0 <- function(x){
  x <- as.numeric(x)
  x[is.na(x)] <- 0
  return(x)
  }

演習(解答例)

data_hosp <- data1[data1$保険区分 == "医科", ]
data_pref <- read.csv(file = "http://u111u.info/k1bc", colClasses = c(rep("character")))
data_hosp_dpc <- merge(data2, data_pref, by.x = "都道府県", by.y = "都道府県名称")
data_hosp_dpc$保険医療機関コード <- paste0(data_hosp_dpc$都道府県コード, data_hosp_dpc$医療機関コード)
data_hosp_dpc_pt <- data3
data_hosp_dpc_pt[,3] <- fun_chr_0(data_hosp_dpc_pt[,3])
data_hosp_dpc_pt[,4] <- fun_chr_0(data_hosp_dpc_pt[,4])
data_hosp_dpc_pt[,5] <- fun_chr_0(data_hosp_dpc_pt[,5])
data_hosp_dpc_pt[,6] <- fun_chr_0(data_hosp_dpc_pt[,6])
data_hosp_dpc_pt[,7] <- fun_chr_0(data_hosp_dpc_pt[,7])
data_hosp_dpc_pt[,8] <- fun_chr_0(data_hosp_dpc_pt[,8])
data <- merge(data_hosp_dpc, data_hosp_dpc_pt, by.x = "告示番号.2", by.y = "告示番号")
data <- merge(data, data_hosp, by = "保険医療機関コード")
data <- data[, c("施設名.x", "保険医療機関コード", "住所", "X97", "X99")]
write.csv(data,"data.csv",row.names=F)

演習(解答例)

まずは、医科の施設に絞る。

data_hosp <- data1[data1$保険区分 == "医科", ]
table(data_hosp$保険区分)

 医科 
92975 

演習(解答例)

次に、医療機関コードに都道府県情報を追加

data_pref <- read.csv(file = "http://u111u.info/k1bc", colClasses = c(rep("character")))
data_hosp_dpc <- merge(data2, data_pref, by.x = "都道府県", by.y = "都道府県名称")
data_hosp_dpc$保険医療機関コード <- paste0(data_hosp_dpc$都道府県コード, data_hosp_dpc$医療機関コード)
head(data_hosp_dpc)
  都道府県 告示番号.2                                       施設名
1     愛知       1014 社会医療法人 名古屋記念財団 名古屋記念病院
2     愛知       1017                                 公立陶生病院
3     愛知       1024       愛知県厚生農業協同組合連合会 海南病院
4     愛知        538                         総合病院 南生協病院
5     愛知       1023                                 西尾市民病院
6     愛知        543 独立行政法人 労働者健康福祉機構 旭労災病院
  医療機関コード              病院類型 DPC算定病床数
1        1600767 平成21年度DPC参加病院           464
2        2300243 平成21年度DPC参加病院           672
3        7500011 平成21年度DPC参加病院           475
4        1402578 平成20年度DPC参加病院           273
5        3200210 平成21年度DPC参加病院           400
6        4500030 平成20年度DPC参加病院           250
  DPC算定病床の入院基本料 DPC算定病床割合.3 精神病床数.4 療養病床数
1                一般7対1            100.0%            0          0
2               一般10対1             93.9%            0          0
3               一般10対1             85.9%            0          0
4                一般7対1             87.2%            0          0
5                一般7対1            100.0%            0          0
6               一般10対1            100.0%            0          0
  結核病床数 病床総数.5 都道府県コード 保険医療機関コード
1          0        464             23          231600767
2         44        716             23          232300243
3          0        553             23          237500011
4          0        313             23          231402578
5          0        400             23          233200210
6          0        250             23          234500030

演習(解答例)

次に、"-“ を0に変換

data_hosp_dpc_pt <- data3
data_hosp_dpc_pt[,3] <- fun_chr_0(data_hosp_dpc_pt[,3])
data_hosp_dpc_pt[,4] <- fun_chr_0(data_hosp_dpc_pt[,4])
data_hosp_dpc_pt[,5] <- fun_chr_0(data_hosp_dpc_pt[,5])
data_hosp_dpc_pt[,6] <- fun_chr_0(data_hosp_dpc_pt[,6])
data_hosp_dpc_pt[,7] <- fun_chr_0(data_hosp_dpc_pt[,7])
data_hosp_dpc_pt[,8] <- fun_chr_0(data_hosp_dpc_pt[,8])
head(data_hosp_dpc_pt)
  告示番号                 施設名 X99 X97 X97.輸血以外の再掲. X03 X02 X01
1        1   札幌医科大学附属病院   0   0                   0  20   0   0
2        2         北海道大学病院   0   0                   0  14   0   0
3        3       旭川医科大学病院   0   0                   0  24   0   0
4        4 弘前大学医学部附属病院  14   0                   0 128   0   0
5        5   岩手医科大学附属病院  17  12                   0 106   0   0
6        6           東北大学病院  10   0                   0  18   0   0

演習(解答例)

データの突合

data <- merge(data_hosp_dpc, data_hosp_dpc_pt, by.x = "告示番号.2", by.y = "告示番号")
data <- merge(data, data_hosp, by = "保険医療機関コード")
data <- data[, c("施設名.x", "保険医療機関コード", "住所", "X97", "X99")]
head(data)
                          施設名.x 保険医療機関コード
1 KKR札幌医療センター 斗南病院          010111085
2                     JR札幌病院          010114386
3       医療法人 北海道循環器病院          010114634
4     医療法人医仁会 中村記念病院          010114790
5   JA北海道厚生連 札幌厚生病院          010116258
6                     市立札幌病院          010116381
                                      住所 X97 X99
1               札幌市中央区北1条西6丁目   0   0
2         札幌市中央区北3条東1丁目1番地   0   0
3 札幌市中央区南27条西13丁目1番30号   0   0
4   札幌市中央区南1条西14丁目291番地   0   0
5         札幌市中央区北3条東8丁目5番地   0   0
6   札幌市中央区北11条西13丁目1番1号   0   0

演習(解答例)

データの保存

write.csv(data,"data.csv",row.names=F)

本日お伝えしたいこと。

  • 前回演習の答え合わせ
  • 最近のR でデータハンドリング

従来のR によるデータハンドリングの面倒な点

  • 遅い
  • 集計がやりにくい
  • データのサブセット取得するのに長いコマンド
  • ((((()))))括弧が多すぎて読みにくい

Hadley Wickham のご紹介

  • R 界の凄い人・Rice University の教員
  • 昔ながらのR の機能を拡張しまくってる。
  • ggplot2, plyr(dplyr), reshape(reshape2), stringr, etc.

dplyr 等のパッケージ紹介

dplyr

  • R のデータハンドリングを楽にしてくれる。

tidyr

  • データのdplyr に合う形でデータの整形を手助けしてくれる。

data.table

  • R へのデータ読み込みを高速化してくれる。

データハンドリング用のパッケージのインストール

install.packages(c("dplyr","tidyr","data.table"))

データハンドリング用のパッケージのインストール

library(dplyr)
library(tidyr)
library(data.table)

data.table を用いた高速なCSV読み込み

以下の様に読み込めます。 data1.tsvに含まれるエラーのせいで少しだけ修正が必要

data1 <- data.table::fread(input = "data1.tsv",
                       header = TRUE,
                       autostart = 1,
                      colClasses = c(rep("character")))
head(data1)
    No       データ日 保険区分 都道府県 保険医療機関コード       施設名
1: 514 平成24年9月1日     歯科       38          381230135 山崎歯科医院
2: 515 平成24年9月1日     歯科       38          381230143   杉歯科医院
3: 516 平成24年9月1日     歯科       38          381230168 月岡歯科医院
4: 517 平成24年9月1日     歯科       38          381230192 小澤歯科医院
5: 518 平成24年9月1日     歯科       38          381230218 さか歯科医院
6: 519 平成24年9月1日     歯科       38          381230226 行元歯科医院
    郵便番号                   住所 病床数        Phone 
1: 799-1351    西条市三津屋50-6        0898-64-1002 
2:  799-1344   西条市円海寺16-3         0898-64-1212
3:  799-1354 西条市北条1429-2         0898-65-4618
4:  799-1322 西条市国安1284-1        0898-66-5000 
5:  799-1353   西条市三津屋南8-7         0898-64-2077
6:  799-1301 西条市三芳1235番地         0898-66-5068

dplyr を用いたデータのハンドリング

filter(data, 条件)

data <- filter(data1, 保険区分 == "医科")
head(data)
   No       データ日 保険区分 都道府県 保険医療機関コード
1:  1 平成24年9月1日     医科       18          180111722
2:  2 平成24年9月1日     医科       18          180112852
3:  3 平成24年9月1日     医科       18          180115087
4:  4 平成24年9月1日     医科       18          180115111
5:  5 平成24年9月1日     医科       18          180115202
6:  6 平成24年9月1日     医科       18          180115368
                                   施設名  郵便番号
1:                               本田医院 918-8238 
2:                             英内科医院  910-0017
3:                   福井県警察職員診療所  910-8515
4:     地方職員共済組合 福井県支部診療所  910-8580
5: 財団法人 福井県予防医学協会附属診療所  918-8238
6:                           赤井内科医院  910-0003
                       住所 病床数        Phone 
1: 福井市和田2丁目1702        0776-22-6124 
2: 福井市文京2-17-20         0776-22-1602
3:   福井市大手3-17-1        0776-22-2880 
4:   福井市大手3-17-1         0776-21-1111
5:   福井市和田2-1006         0776-23-4810
6:   福井市松本2-4-16         0776-21-0061

dplyr を用いたデータのハンドリング

select(data, 列名)

data <- select(data1, 保険区分, 都道府県, 保険医療機関コード)
head(data)
   保険区分 都道府県 保険医療機関コード
1:     歯科       38          381230135
2:     歯科       38          381230143
3:     歯科       38          381230168
4:     歯科       38          381230192
5:     歯科       38          381230218
6:     歯科       38          381230226

dplyr を用いたデータのハンドリング

テーブルのjoin

  • innner_join(data1,data2, by)
  • left_join(data1,data2, by)
  • full_join(data1,data2, by)
  • semi_join(data1,data2, by)
  • anti_join(data1,data2, by)

dplyr を用いたデータのハンドリング

head(data2)
  告示番号.2                 施設名 医療機関コード 都道府県
1          1   札幌医科大学附属病院        0119385   北海道
2          2         北海道大学病院        8010016   北海道
3          3       旭川医科大学病院        8010214   北海道
4          4 弘前大学医学部附属病院        8010221     青森
5          5   岩手医科大学附属病院        0113501     岩手
6          6           東北大学病院        8010146     宮城
               病院類型 DPC算定病床数 DPC算定病床の入院基本料
1 平成15年度DPC参加病院           890            特定機能7対1
2 平成15年度DPC参加病院           874            特定機能7対1
3 平成15年度DPC参加病院           569            特定機能7対1
4 平成15年度DPC参加病院           595            特定機能7対1
5 平成15年度DPC参加病院          1088            特定機能7対1
6 平成15年度DPC参加病院          1216            特定機能7対1
  DPC算定病床割合.3 精神病床数.4 療養病床数 結核病床数 病床総数.5
1             94.9%           42          0          6        938
2             92.4%           72          0          0        946
3             94.5%           33          0          0        602
4             93.6%           41          0          0        636
5             93.3%           78          0          0       1166
6             93.0%           70          0          0       1308

dplyr を用いたデータのハンドリング

data <- inner_join(data2,data_pref,by=c("都道府県" = "都道府県名称"))
head(data)
  告示番号.2                 施設名 医療機関コード 都道府県
1          1   札幌医科大学附属病院        0119385   北海道
2          2         北海道大学病院        8010016   北海道
3          3       旭川医科大学病院        8010214   北海道
4          4 弘前大学医学部附属病院        8010221     青森
5          5   岩手医科大学附属病院        0113501     岩手
6          6           東北大学病院        8010146     宮城
               病院類型 DPC算定病床数 DPC算定病床の入院基本料
1 平成15年度DPC参加病院           890            特定機能7対1
2 平成15年度DPC参加病院           874            特定機能7対1
3 平成15年度DPC参加病院           569            特定機能7対1
4 平成15年度DPC参加病院           595            特定機能7対1
5 平成15年度DPC参加病院          1088            特定機能7対1
6 平成15年度DPC参加病院          1216            特定機能7対1
  DPC算定病床割合.3 精神病床数.4 療養病床数 結核病床数 病床総数.5
1             94.9%           42          0          6        938
2             92.4%           72          0          0        946
3             94.5%           33          0          0        602
4             93.6%           41          0          0        636
5             93.3%           78          0          0       1166
6             93.0%           70          0          0       1308
  都道府県コード
1             01
2             01
3             01
4             02
5             03
6             04

dplyr を用いたデータのハンドリング

mutate(data, 列名=算出方法)

head(data)
  告示番号.2                 施設名 医療機関コード 都道府県
1          1   札幌医科大学附属病院        0119385   北海道
2          2         北海道大学病院        8010016   北海道
3          3       旭川医科大学病院        8010214   北海道
4          4 弘前大学医学部附属病院        8010221     青森
5          5   岩手医科大学附属病院        0113501     岩手
6          6           東北大学病院        8010146     宮城
               病院類型 DPC算定病床数 DPC算定病床の入院基本料
1 平成15年度DPC参加病院           890            特定機能7対1
2 平成15年度DPC参加病院           874            特定機能7対1
3 平成15年度DPC参加病院           569            特定機能7対1
4 平成15年度DPC参加病院           595            特定機能7対1
5 平成15年度DPC参加病院          1088            特定機能7対1
6 平成15年度DPC参加病院          1216            特定機能7対1
  DPC算定病床割合.3 精神病床数.4 療養病床数 結核病床数 病床総数.5
1             94.9%           42          0          6        938
2             92.4%           72          0          0        946
3             94.5%           33          0          0        602
4             93.6%           41          0          0        636
5             93.3%           78          0          0       1166
6             93.0%           70          0          0       1308
  都道府県コード
1             01
2             01
3             01
4             02
5             03
6             04

dplyr を用いたデータのハンドリング

mutate(data, 列名=算出方法)

data <- mutate(data,保険医療機関コード = paste0(都道府県コード, 医療機関コード))
head(data)
  告示番号.2                 施設名 医療機関コード 都道府県
1          1   札幌医科大学附属病院        0119385   北海道
2          2         北海道大学病院        8010016   北海道
3          3       旭川医科大学病院        8010214   北海道
4          4 弘前大学医学部附属病院        8010221     青森
5          5   岩手医科大学附属病院        0113501     岩手
6          6           東北大学病院        8010146     宮城
               病院類型 DPC算定病床数 DPC算定病床の入院基本料
1 平成15年度DPC参加病院           890            特定機能7対1
2 平成15年度DPC参加病院           874            特定機能7対1
3 平成15年度DPC参加病院           569            特定機能7対1
4 平成15年度DPC参加病院           595            特定機能7対1
5 平成15年度DPC参加病院          1088            特定機能7対1
6 平成15年度DPC参加病院          1216            特定機能7対1
  DPC算定病床割合.3 精神病床数.4 療養病床数 結核病床数 病床総数.5
1             94.9%           42          0          6        938
2             92.4%           72          0          0        946
3             94.5%           33          0          0        602
4             93.6%           41          0          0        636
5             93.3%           78          0          0       1166
6             93.0%           70          0          0       1308
  都道府県コード 保険医療機関コード
1             01          010119385
2             01          018010016
3             01          018010214
4             02          028010221
5             03          030113501
6             04          048010146

dplyr を用いたデータのハンドリング

%>%

チェイン演算子

data2 %>%
  inner_join(.,data_pref,by=c("都道府県" = "都道府県名称")) %>%
  mutate(.,保険医療機関コード = paste0(都道府県コード, 医療機関コード)) %>%
  select(.,施設名, 都道府県コード, 保険医療機関コード) %>%
  head(.)
                  施設名 都道府県コード 菫晞匱蛹サ逋よゥ滄未繧ウ繝シ繝<89>
1   札幌医科大学附属病院             01                      010119385
2         北海道大学病院             01                      018010016
3       旭川医科大学病院             01                      018010214
4 弘前大学医学部附属病院             02                      028010221
5   岩手医科大学附属病院             03                      030113501
6           東北大学病院             04                      048010146

dplyr を用いたデータのハンドリング

groupp_by(data, group)

surmmarise(data, 集計方法)

data2 %>%
  inner_join(.,data_pref,by=c("都道府県" = "都道府県名称")) %>%
  mutate(.,保険医療機関コード = paste0(都道府県コード, 医療機関コード)) %>%
  group_by(.,都道府県コード,都道府県) %>%
  summarise(cnt = n())
Source: local data frame [47 x 3]
Groups: 都道府県コード

   都道府県コード 都道府県 cnt
1              01   北海道 104
2              02     青森  14
3              03     岩手  14
4              04     宮城  24
5              05     秋田  14
6              06     山形  15
7              07     福島  23
8              08     茨城  34
9              09     栃木  17
10             10     群馬  22
..            ...      ... ...

演習

data2, data3 を用いて都道府県毎の平均的な100病床あたりの急性心筋梗塞症例数を算出してください。

演習(参考資料)