Data handling with R

Hiroki Matsui
20150416

この資料は

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

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

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

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

本日お伝えしたいこと。

  • なぜR でデータハンドリングを行うのか?
  • 他のソフトウェアとの比較
  • データの読み込み
  • 90年代R でデータハンドリング

本日お伝えしたいこと。

なぜR でデータハンドリングを行うのか?

  • 他のソフトウェアとの比較
  • データの読み込み
  • 90年代R でデータハンドリング

なぜR でデータハンドリングを行うのか?

解析結果の再現性

R でデータ解析するため。

SPSSのGUIではやりにくい処理をさせるため。

解析結果の再現性

解析結果の再現性を担保するには

  • Data ← Fixed data
  • Code ← CUI によるdata handling, 解析
  • Result ← Reporting を含めた出力

本日お伝えしたいこと。

  • なぜR でデータハンドリングを行うのか?

他のソフトウェアとの比較

  • データの読み込み
  • 90年代R でデータハンドリング

教室内の他のソフトウェアとの比較

SPSS

  • GUI
  • シンタックスでCodeを保存
  • Data はHDD上

SAS

  • CUI
  • Code を保存
  • Data はHDD上

R

  • CUI
  • Code を保存
  • Data はメモリ上

SQL

  • CUI
  • Code を保存
  • Data はHDD上

教室内の他のソフトウェアとの比較(個人的切り分け)

  • メモリに乗るデータ

    R で処理して解析

  • メモリに乗らないデータをShrinkして使う。

    SQL でハンドリングしてR に読み込む。

  • メモリに乗らないデータをそのまま使う(機械学習など)

    Python?

  • その他諸々

    Excel・Access・AWK・シェル芸・perl でテキスト処理・SASで解析・Hadoop廻そう….
    臨機応変に多分効率的な手段を選択。

本日お伝えしたいこと。

  • なぜR でデータハンドリングを行うのか?
  • 他のソフトウェアとの比較

データの読み込み

  • 90年代R でデータハンドリング

データの読み込み

以下のデータをダウンロードして下さい。
http://u111u.info/k1dd

データの読み込み

Rstudio を使うとデータの読み込みがGUI で出来ます。

データの読み込み

以下の様に書けます。

data1 <- read.csv(# file 名
                  file= "C:/Users/HEER_matsui/Desktop/data1.tsv", 
                  # 1行目を列名にする。
                  header = T,
                  # tab 区切りのファイル
                  sep = "\t",
                  # 全てのカラムは文字列として読み込む。
                  colClasses=rep("character",11))                 

データの読み込み

URLからのデータ読み込みも可能です。 例えば、http://u111u.info/k14zにあるCSVからデータを読み込めます。

data2 <- read.csv(file= "http://u111u.info/k14z",
                  header = T,
                  colClasses=rep("character",12))   
data3 <- read.csv(file= "http://u111u.info/k14F",
                  header = T,
                  colClasses=rep("character",8))   

データの読み込み

クリップボードからの読み込みも可能です。

  • このファイルをダウンロードしてください。
  • セルを選択してコピーして下さい。
data4 <- read.table("clipboard",header = T)

本日お伝えしたいこと。

  • なぜR でデータハンドリングを行うのか?
  • 他のソフトウェアとの比較
  • データの読み込み

90年代R でデータハンドリング

R のデータ形式

  • vector
  • matrix
  • list
  • data.frame

R のデータ形式

  • vector
  • matrix
  • list
  • data.frame

R のデータ形式

vector

vec1 <- c(1:3)
vec1
[1] 1 2 3
vec2 <- c("a","b","c")
vec2
[1] "a" "b" "c"
vec3 <- c(T,F,T)
vec3
[1]  TRUE FALSE  TRUE

R のデータ形式

vector

vec1[c(1,2)]
[1] 1 2
vec2[c(T,T,F)]
[1] "a" "b"
vec3[-1]
[1] FALSE  TRUE

R のデータ形式

data.frame

temp_data <- data.frame(x1 =vec1, x2 = vec2,x3 =vec3)

R のデータ形式

data.frame

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           FAX
1 799-1351    西条市三津屋50-6        0898-64-1002               
2  799-1344   西条市円海寺16-3         0898-64-1212 0898-64-1212 
3  799-1354 西条市北条1429-2         0898-65-4618 0898-65-5477 
4  799-1322 西条市国安1284-1        0898-66-5000               
5  799-1353   西条市三津屋南8-7         0898-64-2077 0898-65-5324 
6  799-1301 西条市三芳1235番地         0898-66-5068 0898-66-0882 
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

R のデータ形式

data.frame

temp_data[1, ]
  x1 x2   x3
1  1  a TRUE
temp_data[ ,1]
[1] 1 2 3

R のデータ形式

data.frame

data1[1:3, ]
   No       データ日 保険区分 都道府県 保険医療機関コード       施設名
1 514 平成24年9月1日     歯科       38          381230135 山崎歯科医院
2 515 平成24年9月1日     歯科       38          381230143   杉歯科医院
3 516 平成24年9月1日     歯科       38          381230168 月岡歯科医院
   郵便番号                   住所 病床数         Phone           FAX
1 799-1351    西条市三津屋50-6        0898-64-1002               
2  799-1344   西条市円海寺16-3         0898-64-1212 0898-64-1212 
3  799-1354 西条市北条1429-2         0898-65-4618 0898-65-5477 
data1[1:3,c(2,3)]
        データ日 保険区分
1 平成24年9月1日     歯科
2 平成24年9月1日     歯科
3 平成24年9月1日     歯科

R のデータ形式

data.frame

data1[1:3,"データ日"]
[1] "平成24年9月1日" "平成24年9月1日" "平成24年9月1日"
data1$データ日[1:3]
[1] "平成24年9月1日" "平成24年9月1日" "平成24年9月1日"

R のデータフレーム操作

# カラム追加
temp_data$x4 <- c(4:6)
temp_data$x5 <- temp_data$x1 * temp_data$x4
# 行の抽出
temp_data$x5 == 4
[1]  TRUE FALSE FALSE
temp_data[temp_data$x5 == 4, ]
  x1 x2   x3 x4 x5
1  1  a TRUE  4  4

R のデータフレーム操作

# データのマージ
temp_data_2 <- data.frame(x6 = c("a","b","d"), x7 = c("疾患A","疾患B","疾患D"))
merge(x = temp_data, y =temp_data_2, by.x = "x2", by.y = "x6")
  x2 x1    x3 x4 x5    x7
1  a  1  TRUE  4  4 疾患A
2  b  2 FALSE  5 10 疾患B
merge(x = temp_data, y =temp_data_2, by.x = "x2", by.y = "x6",all = T)
  x2 x1    x3 x4 x5    x7
1  a  1  TRUE  4  4 疾患A
2  b  2 FALSE  5 10 疾患B
3  c  3  TRUE  6 18  <NA>
4  d NA    NA NA NA 疾患D

R のデータフレーム操作

# データのマージ
merge(x = temp_data, y =temp_data_2, by.x = "x2", by.y = "x6",all.x = T)
  x2 x1    x3 x4 x5    x7
1  a  1  TRUE  4  4 疾患A
2  b  2 FALSE  5 10 疾患B
3  c  3  TRUE  6 18  <NA>
merge(x = temp_data, y =temp_data_2, by.x = "x2", by.y = "x6",all.y = T)
  x2 x1    x3 x4 x5    x7
1  a  1  TRUE  4  4 疾患A
2  b  2 FALSE  5 10 疾患B
3  d NA    NA NA NA 疾患D

演習

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)