統数研シンポジウム r 061109jasp.ism.ac.jp/kinou2sg/contents/ism_symposium_r_2006.pdf0.20...

61
で データハンドリング ~ データフレーム 30 分クッキング ~

Upload: others

Post on 24-Jun-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

で データハンドリング~ データフレーム 30 分クッキング ~

Page 2: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

2

本日のメニュー

データフレームとは ←

データフレームの作成

データハンドリングの方法と例

height

Density

0.000.050.100.150.200.25

60 65 70 75 80

Bass 2 Bass 1

Tenor 2

0.000.050.100.150.200.25

Tenor 10.000.050.100.150.200.25

Alto 2 Alto 1

Soprano 2

60 65 70 75 80

0.000.050.100.150.200.25

Soprano 1

Page 3: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

3

データフレームとは

EXCEL:シート ACCESS:テーブル SAS:データセット

統計解析を行うデータの形式は様々

( R 上で)データを手で入力して・・・

テキストファイル,EXCEL,ACCESS,SAS などの形式

R でデータ解析を行う際は,データフレームという形式

にデータを変換することが多い(見た目は行列)

Page 4: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

4

データフレームとは

数値ベクトルや文字ベクトル,

因子ベクトルなどの異なる型の

データをまとめてもつ変数

⇒ 外見は行列と同じ

⇒ 各列の要素の型はバラバラ

でも構わない

データフレームの各行・各列は

ラベルを必ず持ち,ラベルに

よる操作が可能

64166M

57173M

72177M

55162F

51158F

WEIGHTHEIGHTSEX

Page 5: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

5

本日のメニュー

データフレームとは

データフレームの作成 ←

データハンドリングの方法と例

Scatter Plot Matrix

Sepal.Length7

87 8

5

6

5 6

Sepal.Width3.54.04.5

3.54.04.5

2.02.53.0

2.02.53.0

Petal.Length4567

4 5 6 7

1234

1 2 3 4

Petal.Width1.52.02.5

1.52.02.5

0.00.51.0

0.00.51.0

Page 6: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

6

データフレームの作成

R でベクトルデータを作成した後,データフレームを作成

(いわゆる手入力)

⇒ 「性別」「身長」「体重」データをベクトルで用意

した後,関数 data.frame() で1つのデータフレーム

に変換する

ファイルからデータを読み込んで,データフレームを作成

⇒ 関数 read.table() などでファイルからデータを読込

⇒ パッケージ RODBC の関数 odbcConnectXXXXX() で

データファイルにアクセスした後,関数 sql.Query()でファイルからデータを読込

Page 7: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

7

M

M

M

F

F

SEX

64

57

72

55

51

WEIGHT

166

173

177

162

158

HEIGHT

64166M

57173M

72177M

55162F

51158F

WEIGHTHEIGHTSEX

> sex <- c("F","F","M","M","M")> height <- c(158,162,177,173,166)> weight <- c( 51, 55, 72, 57, 64)

> x <- data.frame(SEX=sex, HEIGHT=height,WEIGHT=weight)

data.frame()

データフレームの作成(手入力)

Page 8: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

8

データフレームの閲覧

データフレームの中身を確認したいときは・・・R のコンソール画面で

R 標準のデータエディタで (←データを見ながらの作業不可)relimp パッケージのテキストウインドウで

データエディタ> edit(x)

テキストウインドウ> library(relimp)> showData(x)

コンソール上> x

Page 9: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

9

データフレームを作成すると・・・

> summary(x) # データフレームの列ごとの特徴を見る

SEX HEIGHT WEIGHT F:2 Min. :158.0 Min. :51.0 M:3 1st Qu.:162.0 1st Qu.:55.0

Median :166.0 Median :57.0 Mean :167.2 Mean :59.8 3rd Qu.:173.0 3rd Qu.:64.0 Max. :177.0 Max. :72.0

# 密度関数のプロット> library(lattice)> densityplot(~ height | voice.part, data=singer, layout=c(2,4))

# 対散布図> splom(~ iris[1:4], groups = Species, data = iris,+ panel = panel.superpose)

64166M

57173M

72177M

55162F

51158F

WEIGHTHEIGHTSEX

Page 10: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

10

データフレームの作成(⇔ .txt )

> x <- read.table("data04.txt",header=T, sep="," )

sex height weight1 F 158 512 F 162 553 M 177 724 M 173 575 M 166 64

> x <- read.csv("data04.txt")

sex,height,weightF,158,51F,162,55M,177,72M,173,57M,166,64

data04.txt

関数 read.table()などでテキストファイルからデータを

読み込むことが出来る

Page 11: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

11

データフレームの作成(RODBC)

パッケージ RODBC の中の関数 odbcConnectXXXXX()でデータファイルにアクセスした後,関数 sql.Query() でファイルからデータを読み込むことが出来る

> library(RODBC) # パッケージの呼出> tmp <- odbcConnectExcel("c:/data00.xls") # データに接続> tmp <- odbcConnectAccess("c:/data00.mdb") # (Access の場合)> sqlTables(tmp) # テーブルを表示> x <- sqlQuery(tmp,"select * from [Sheet1$]") # 読み込み> x <- sqlQuery(tmp,"select * from [mydata]") # (Access の場合)> odbcClose(tmp) # 接続を遮断

他にも ORACLE のデータベースや,その他のデータ形式ファイル(DBASE,MySQL,PostgreSQL)からデータフレームを作成することもできる

Page 12: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

12

データフレームの作成(foreign)

Read a SAS XPORT Format Libraryread.xport()Obtain a Data Frame from a Systat Fileread.systat()Obtain a Data Frame from a SAS Permanentread.ssd()Read an SPSS Data Fileread.spss()Read Octave Text Data Filesread.octave()Read a Minitab Portable Worksheetread.mtp()Read Epi Info Data Filesread.epiinfo()Read Stata Binary Filesread.dta()Read a DBF Fileread.dbf()Read an S3 Binary Filedata.restore()

用途関数

パッケージ foreign の中には,外部データを読み込む

ための関数が多数用意されている

Page 13: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

13

データフレームの作成(foreign)

> library(foreign)

SPSS データを R に読み込む例

> x <- read.spss("mydata.sav")

SAS データを R に読み込む例

*** SAS データを XPT ファイルに変換 ;libname out xport "C:/mydata.xpt" ;proc copy in=work out=out ;select mydata / mt=data ;run ;

### R から SAS の XPT ファイルを読み込む> x <- read.xport("C:/mydata.xpt")

Page 14: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

14

本日のメニュー

データフレームとは

データフレームの作成

データハンドリングの方法と例 ←

Page 15: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

15

データハンドリング例(導入)

Aさん~D女史 (変数はNAME) の 4 人に,やせ薬

(GROUP==Active) か偽薬 (GROUP==Placebo) を投薬する

投薬してから1日目(DAY==1)~3日目(DAY==3)に体重を測定する

体重は,午前 (KG_AM) と午後 (KG_PM) の1日2回測定する

B氏D女史CくんAさん

NAME

PlaceboActivePlaceboActiveGROUP

D女史B氏AさんCくんCくんD女史AさんB氏B氏D女史CくんAさん

NAME

59.959.8358.659.0361.563.5371.269.8370.271.2261.461.2264.065.8259.558.1258.058.5161.762.7171.571.3166.665.21

KG_PMKG_AMDAY

Page 16: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

16

データハンドリング例(導入)

B氏D女史CくんAさん

NAME

PlaceboActivePlaceboActiveGROUP

データの形式は EXCEL体重に関するデータとグループに関するデータの 2 つ

まずは 2 つのデータセットを R に読み込ませる

D女史B氏AさんCくんCくんD女史AさんB氏B氏D女史CくんAさん

NAME

59.959.8358.659.0361.563.5371.269.8370.271.2261.461.2264.065.8259.558.1258.058.5161.762.7171.571.3166.665.21

KG_PMKG_AMDAY

data1.xls ⇒ データフレーム x1 に data2.xls ⇒ x2 に

Page 17: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

17

データハンドリング例(1)

### データの読み込み

> library(RODBC) # パッケージの呼出> tmp <- odbcConnectExcel("C:/data1.xls") # データに接続> x1 <- sqlQuery(tmp,"select * from [Sheet1$]") # 読み込み> odbcClose(tmp) # 接続を遮断

> tmp <- odbcConnectExcel("C:/data2.xls") # データに接続> x2 <- sqlQuery(tmp,"select * from [Sheet1$]") # 読み込み> odbcClose(tmp) # 接続を遮断

読み込み

Page 18: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

18

データハンドリング例(2)

### データフレーム x1 と x2 を併合(マージ)する### 本当は列について自動で整列されるが,あえて整列させない

> x <- merge(x1, x2, by="NAME", all=T, sort=F)

データフレーム x

59.958.661.571.270.261.464.059.558.061.771.566.6

KG_PM

D女史B氏AさんCくんCくんD女史AさんB氏B氏D女史CくんAさん

NAME

Active59.83Placebo59.03Active63.53Placebo69.83Placebo71.22Active61.22Active65.82Placebo58.12Placebo58.51Active62.71Placebo71.31Active65.21

GROUPKG_AMDAY

Page 19: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

19

データハンドリング例(3)

### 列の順番を入れ替える

> x <- x[,c(1,5,2,3,4)]> x <- x[,c("NAME","GROUP","DAY","KG_AM","KG_PM")]

データフレーム x

D女史B氏AさんCくんCくんD女史AさんB氏B氏D女史CくんAさん

NAME

59.959.83Active58.659.03Placebo61.563.53Active71.269.83Placebo70.271.22Placebo61.461.22Active64.065.82Active59.558.12Placebo58.058.51Placebo61.762.71Active71.571.31Placebo66.665.21Active

KG_PMKG_AMDAYGROUP

Page 20: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

20

データハンドリング例(4)

### 行についてデータを NAME で整列(ソート;1変数)する> sortlist <- order(x$NAME) # 順番を取得> X <- x[sortlist,] # 整列> rownames(X) <- c(1:nrow(X)) # 行番号の整形

D女史D女史D女史CくんCくんCくんB氏B氏B氏

AさんAさんAさん

NAME

59.959.83Active61.461.22Active61.762.71Active71.269.83Placebo70.271.22Placebo71.571.31Placebo58.659.03Placebo59.558.12Placebo58.058.51Placebo61.563.53Active64.065.82Active66.665.21ActiveKG_PMKG_AMDAYGROUP

データフレーム X

Page 21: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

21

データハンドリング例(目的は・・・)

D女史D女史D女史CくんCくんCくんB氏B氏B氏AさんAさんAさんNAME

59.959.83Active61.461.22Active61.762.71Active71.269.83Placebo70.271.22Placebo71.571.31Placebo58.659.03Placebo59.558.12Placebo58.058.51Placebo61.563.53Active64.065.82Active66.665.21ActiveKG_PMKG_AMDAYGROUP

D女史

Aさん

NAME

「3日目の体重の平均」と「1日目の体重の平均」の変化量が -2kg 未満の人

を抽出する

Page 22: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

22

データハンドリング例(5)

### apply(列を指定, 1(行毎という意味), 適用する関数)> tmp <- apply(X[,4:5], 1, mean)> tmp <- apply(X[,4:5], 1, function(x){sum(x)/length(x)} )

### 列を追加する関数 transform(データフレーム名, 列名=ベクトル)> X1 <- transform(X, MEAN=tmp)

59.961.461.771.270.271.558.659.558.061.564.066.6KG_PM

D女史D女史D女史CくんCくんCくんB氏B氏B氏AさんAさんAさん

NAME

59.8559.83Active61.3061.22Active62.2062.71Active70.5069.83Placebo70.7071.22Placebo71.4071.31Placebo58.8059.03Placebo58.8058.12Placebo58.2558.51Placebo62.5063.53Active64.9065.82Active65.9065.21Active

MEANKG_AMDAYGROUP

Page 23: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

23

データハンドリング例(6)

### 列の数を絞る transform(データフレーム[,残す列])> X2 <- transform(X1[,c(1,2,3,6)])

### 列の数を絞る subset(データフレーム名, ### select=-c(削る列1,削る列2, ...))> X2 <- subset(X1, select = -c(KG_AM, KG_PM))

D女史D女史D女史CくんCくんCくんB氏B氏B氏

AさんAさんAさん

NAME

59.853Active61.302Active62.201Active70.503Placebo70.702Placebo71.401Placebo58.803Placebo58.802Placebo58.251Placebo62.503Active64.902Active65.901Active

MEANDAYGROUP

Page 24: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

24

データハンドリング例(7)

###「DAY毎の平均」という列を追加### 横展開する関数 reshape(データフレーム名, idvar=固定する列,### timevar=横展開する列, direction="wide")> X3 <- reshape(X2, idvar =c("NAME","GROUP"),+ timevar="DAY", direction="wide")

61.3

70.7

58.8

64.9

MEAN.2

D女史

Cくん

B氏

Aさん

NAME

59.8562.20Active

70.5071.40Placebo

58.8058.25Placebo

62.5065.90Active

MEAN.3MEAN.1GROUP

Page 25: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

25

データハンドリング例(8)

###「3日目の体重の平均」-「1日目の体重の平均」### という列「DIFF」を作成した後,列の数を絞る> X4 <- transform(X3[,c("NAME","GROUP")],

DIFF = (X3$MEAN.3 - X3$MEAN.1) )

D女史

Cくん

B氏

Aさん

NAME

-2.35Active

-0.90Placebo

0.55Placebo

-3.40Active

DIFFGROUP

Page 26: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

26

データハンドリング例(9)

### 体重の変化量が -2kg 未満:subset(データフレーム, 条件式)> subset(X4, DIFF < -2)

### 体重の変化量が -2kg 未満の人:subset(データ, 条件式, 列名)> subset(X4, DIFF < -2, c(NAME))

D女史

Aさん

NAME

-2.35Active

-3.40Active

DIFFGROUP

D女史

Aさん

NAME

Page 27: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

27

データハンドリング例(10)

### ちなみに,B 氏と C くんを取り出す場合は・・・:### subset(データフレーム, 列名 %in% 集合ベクトル)> subset(X4, NAME %in% c("B氏","Cくん"))

### ちなみに,これはエラーとなる・・・> subset(X4, DIFF<-2)

Cくん

B氏

NAME

-0.90Placebo

0.55Placebo

DIFFGROUP

Page 28: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

28

本日のメニュー

データフレームとは統計解析を行うためのデータの形式見た目は行列 ⇒ でも使い勝手が良い

データフレームの作成手入力でもデータの読み込み可だけど・・・外部データ(テキストファイル, EXCEL,ACCESS,SAS,・・・)からでも読み込み可

データハンドリングの方法と例RODBC を使ったデータ読み込みの例を紹介

データのマージ,ソート,変数追加,変数削除,データの横展開,条件抽出の例を紹介

Page 29: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

29

【おまけ】実務で R にデータを読み込む際・・・

① 〔EXCEL〕→〔RODBCでデータフレームにする〕

② 〔EXCEL〕→〔CSVに変換〕

→〔関数 read.table() でデータフレームにする〕

②'〔他のアプリ〕→〔テキストデータ〕

→〔関数 read.table() でデータフレームにする〕

③〔SAS〕→〔xptに変換〕→〔read.xport()でデータフレームにする〕

(SAS でできないことを R にさせるという意図)

④ SQLでデータベースにも直接アクセスできるはず

⑤ XMLでデータを入力,出力させることもできるはず

★データがちゃんと入力されているかを確認する方法は?・「データフレームから抜き取り」とか「要約統計量」とか

・「次元の数」と「一番右下のセルに値が正しく入っているか」を確認

・欠測の数を数える

・EXCEL に出力して比較(コンペア)する

・R から折り返しはきだし,SAS 上で比較(コンペア)する

Page 30: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

30

参考文献&謝辞

参考文献THE R BOOK 4章(岡田昌史 他;九天社)

データ解析環境 R 5章(舟尾,高浪;工学社)

パッケージ「RODBC」「foreign」のヘルプ

発表資料作成の際にお世話になった人北西 由武さん(塩野義製薬)

高浪 洋平さん(武田薬品工業)

Page 31: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

で データハンドリング~ データフレーム 30 分クッキング ~

Page 32: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

で データハンドリング~ ここからはおまけ ~

Page 33: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

33

★ 作業ディレクトリの変更

ファイルからデータを読み込むには・・・まず,データがあるディレクトリ(フォルダ)に作業ディレクトリを変更する

次に,関数 read.table() などでファイルからデータを読み込む

ファイルからデータやプログラムを読み込んだり,ファイルにデータを書き出したりする場所を作業ディレクトリという

指定したディレクトリに指定した作業ディレクトリにデータがセーブされたり,R 用エディタなどが保存

されるようになる

> setwd("c:/usr") # 作業ディレクトリを変更> getwd() # 現在のディレクトリを確認[1] "c:/usr"

Page 34: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

34

★ 作業ディレクトリの変更 (Windows)

[ファイル] の [ディレクトリの変更]を選択

[Browse] をクリックして,変更先のディレクトリを選択

Page 35: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

35

★ 作業ディレクトリの変更 (Mac OS X)

[その他] の 作業[ディレクトリの変更]を選択

変更先のディレクトリを選択

Page 36: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

36

★ テキストファイル ⇒ データフレーム

> x <- read.table("data01.txt")

V1 V2 V31 F 158 512 F 162 553 M 177 724 M 173 575 M 166 64

F 158 51F 162 55M 177 72M 173 57M 166 64

data01.txt

(1) 列名がなく,データ間がスペースで区切られている場合⇒ R が勝手に列名を決めている

Page 37: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

37

★ テキストファイル ⇒ データフレーム

> x <- read.table("data02.txt",header=T )

sex height weight1 F 158 512 F 162 553 M 177 724 M 173 575 M 166 64

sex height weightF 158 51F 162 55M 177 72M 173 57M 166 64

data02.txt

(2) 列名があり,データ間がスペースで区切られている場合

Page 38: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

38

★ テキストファイル ⇒ データフレーム

> x <- read.table("data03.txt", header=T, skip=1 )

sex height weight1 F 158 512 F 162 553 M 177 724 M 173 575 M 166 64

### data03.txtsex height weightF 158 51F 162 55M 177 72M 173 57M 166 64

data03.txt

(3)1行目にコメント,2行目に列名があり,

データ間がスペースで区切られている場合

Page 39: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

39

★ テキストファイル ⇒ データフレーム

> x <- read.table("data04.txt", header=T, sep="," )

sex height weight1 F 158 512 F 162 553 M 177 724 M 173 575 M 166 64

sex,height,weightF,158,51F,162,55M,177,72M,173,57M,166,64

data04.txt

(4) 列名があり,データ間がコンマで区切られている場合

Page 40: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

40

★ テキストファイル ⇔ EXCEL

目的は関数 read.csv() で読み込める形式にすること(前節の data04.txt の状態)

まず,EXCEL ファイルを開き,メニューの[ファイル] の [開く] から,[名前をつけて保存] を選択する

保存する名前をつけた後,次に [ファイルの種類] から [CSV カンマ区切り]を選択して保存する

Page 41: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

41

★ テキストファイル ⇔ EXCEL

Windows 版 R の場合

別名で保存

CSV(カンマ区切り)で保存

Page 42: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

42

★ テキストファイル ⇔ EXCEL

Mac OS X 版 R の場合

別名で保存

CSV(カンマ区切り)で保存

Page 43: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

43

★ テキストファイル ⇔ EXCEL

> x <- read.csv("data04.csv")

sex height weight1 F 158 512 F 162 553 M 177 724 M 173 575 M 166 64

sex,height,weightF,158,51F,162,55M,177,72M,173,57M,166,64

data04.csv

(4’) 列名があり,データ間がコンマで区切られている場合

Page 44: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

44

★ テキストファイル ⇔ EXCEL

> myname <- c("SEX","HEIGHT","WEIGHT")> x <- read.csv("data05.csv",

header=F, col.names=myname )sex height weight1 F 158 512 F 162 553 M 177 724 M 173 575 M 166 64

F,158,51F,162,55M,177,72M,173,57M,166,64

data05.csv

(5) 列名がなく,データ間がコンマで区切られている場合

Page 45: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

45

★ データフレームの作成〔EXCELのセルをコピー&ペースト〕

Windows 版の場合は,列名をコピーしても

しなくてもよい

# 列名をコピーした場合

x <- read.delim("clipboard", header= T )

# 列名をコピーしなかった場合

x <- read.delim("clipboard", header= F )

Page 46: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

46

★ データフレームの作成〔EXCELのセルをコピー&ペースト〕

Mac OS X 版の場合は,列名をコピーしては

いけない

excel.mac <- function(...) {args <- c(...)temp <- matrix(scan(""), byrow=TRUE,

ncol=length(args))data <- data.frame(temp)colnames(data) <- argsreturn(data)}excel.mac("X", "Y") # 列名を入力1: # ペーストする

Page 47: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

47

★ SAS ⇒ XML ⇒ R (1)

パッケージ XML と SASXML を使用する(作者:Duncan Temple Lang 氏<[email protected]>)まず,SAS データセット⇒ XML に変換する

*--- SAS 上のコマンド;libname xxx xml "C:/demo.xml"

xmltype=oimdbm xmlschema=yes ;proc format ;value sexf 1="Female"

2="Male" ;data demo(label="Test") ;input id name $ sex ;format sex sexf. ; label sex="Gender" ;cards;

111 ABC 1222 DEF 2333 GHI 1444 JKL 2

;proc copy in=work out=xxx ; select demo ; run;

Page 48: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

48

★ SAS ⇒ XML ⇒ R (2)

次に XML ⇒ R へ読み込む

パッケージ SASXML の中に入っているソース

eventSAS.S,sas.S,sasDataset.R を実行する

その後,以下を実行する

> library(XML)> x <- sas("C:/demo.xml")> x$DEMO

id name sex1 111 ABC Female2 222 DEF Male3 333 GHI Female4 444 JKL Male

Page 49: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

49

★ <寄り道> R ⇒ XML ⇒ R

> ### R ⇒ XML へ出力(要パッケージ XML)> tmp <- xmlOutputDOM()> tmp$addTag("MYDATA", close=F)> tmp$addTag("X", 1); tmp$addTag("Y", "Yes")> tmp$closeTag() # MYDATA

> tmp$addTag("MYDATA", close=F)> tmp$addTag("X", 2); tmp$addTag("Y", "No")> tmp$closeTag() # MYDATA> saveXML(tmp$value(), file="C:/mydata.xml")

### XML ⇒ R へ入力(要パッケージ SASXML)> x <- sasXMLDataSet("C:/mydata.xml")> x$data$MYDATA

X Y1 1 Yes2 2 No

Page 50: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

50

★ <寄り道> R から SAS を操作する

関数 system() を用いる

### R から SAS を操作する> cat("proc print data=sashelp.class;¥n",+ file="C:/test.sas")> cat("run;¥n", file="C:/test.sas",+ append=T)> system(paste('"C:/SASV8/nls/ja/sas.exe"',+ '"C:/test.sas"',+ '-log C:/test.log+ -print C:/test.lst '),+ wait = F)

SAS の出力

Page 51: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

51

★ <寄り道> SAS から R を操作する

x コマンドを用いて DOS を起動し,R を実行する

*--- SAS から R を操作する ;filename aaa "C:/test.R" ;options noxwait xsync ;

data _null_ ;file aaa ;put 'x <- 1:5; sink("C:/out.txt"); mean(x)';run ;

x '"C:/Program Files/R/R-2.3.1/bin/R.exe"--no-save < "C:/test.R"' ;

R の出力

Page 52: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

52

★ データへのアクセス方法(1)

性別が F(女性)かつ体重が 50kg より大きい行を表示

x[ ,SEX=="F" & WEIGHT>50 ]

性別が F(女性)である行を表示x[SEX=="F", ]

論理ベクトル c(T,F,T) が TRUE となっている列を表示

x[ ,c(T,F,T)]

3 行目と 4 行目のデータを表示x[c(3, 4), ] 1 列目と 2 列目のデータを表示x[c(1, 2)] 指定した列の 3 行目のデータを表示x[[3,"列名"]], x[[3,"列名"]] 3 行 2 列目のデータを表示x[3, 2], x[[3, 2]] 2 番目の列データを表示x[2], x[[2]]

指定した列データを表示x$列名,x[“列名”],x[["列名"]]

機能コマンド

Page 53: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

53

★ データへのアクセス方法(2)

データフレーム[行番号,列番号] で指定する

x[c(1,3,5),] # 1,3,5行目にアクセスsex height weight

1 F 158 513 M 177 725 M 166 64

x[,c(1,3)] # 1,3列目にアクセスsex weight

1 F 512 F 553 M 724 M 575 M 64

64166M

57173M

72177M

55162F

51158F

WEIGHTHEIGHTSEX

データフレーム x

Page 54: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

54

★ データへのアクセス方法(3)

データフレーム$列名 で指定する

> x$height # 身長データ[1] 158 162 177 173 166

> x$height <- NULL # 身長を削除> xsex weight

1 F 512 F 553 M 724 M 575 M 64

64166M

57173M

72177M

55162F

51158F

WEIGHTHEIGHTSEX

データフレーム x

Page 55: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

55

★ データの加工・抽出(1)

x と y を併合(マージ)する.※通常は引数に all=T を指定し,データを全て

残す.all=T を指定しなければデータの共通部分が結果として返される.

merge(x,y)

x と y を横に並べて結合するdata.frame(x,y)

x と y を横に並べて結合するcbind(x,y)

x と y を縦に並べて結合するrbind(x,y)

x の列名を表示するnames(x)

x の行数(データ数)を求めるnrow(x)

x の列数(変数の数)を求めるncol(x)機能コマンド

Page 56: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

56

★ データの加工・抽出(2)

ベクトルで指定した列に対し,条件式に合う行のみを抽出する

subset(x, 条件式, ベクトル)

条件式に合う行のみを抽出するsubset(x, 条件式)

データフレーム x に新たな列 y を追加するtransform(x, y=ベクトル)

NA を含む行を削除するna.omit(x)

末尾から b 行だけ抽出するtail(x, n=b)

先頭から a 行だけ抽出するhead(x, n=a)

機能コマンド

Page 57: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

57

★ データのマージ

### データフレーム x1 と x2 を併合(マージ)する> x <- merge(x1, x2, by="NAME", all=T, sort=F)

### x1 と x3 で,マージするためのキー変数が異なる場合> x <- merge(x1, x3, by.x="NAME", by.y="NAME2")

B氏D女史CくんAさん

NAME

PlaceboActivePlaceboActiveGROUP

D女史B氏AさんCくんCくんD女史AさんB氏B氏D女史CくんAさん

NAME

59.959.8358.659.0361.563.5371.269.8370.271.2261.461.2264.065.8259.558.1258.058.5161.762.7171.571.3166.665.21

KG_PMKG_AMDAY

B氏D女史CくんAさん

NAME2

PlaceboActivePlaceboActiveGROUP

x1 x2

x3

Page 58: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

58

★ データのソート(2変数のソート)

### 行についてデータを整列(ソート;2変数)する### sortlist <- order(第1変数, 第2変数)> sortlist <- order(x$GROUP, x$DAY) # 順番を取得> X <- x[sortlist,] # 整列> rownames(X) <- c(1:nrow(X)) # 行番号の整形> X

CくんB氏CくんB氏CくんB氏D女史AさんD女史AさんD女史Aさん

NAME

71.269.83Placebo58.659.03Placebo70.271.22Placebo59.558.12Placebo71.571.31Placebo58.058.51Placebo59.959.83Active61.563.53Active61.461.22Active64.065.82Active61.762.71Active66.665.21Active

KG_PMKG_AMDAYGROUP

Page 59: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

59

★ 欠損の扱い(1)

手入力でデータフレームを作成する場合で欠損が含まれているデータを読み込む場合は,ベクトル中の欠損部分を NA としておけば,該当部分に欠損値(NA)が入る.

> sex <- c("F",NA,"M"); height <- c(158,162,NA);> weight <- c(51,55,72)> ( x <- data.frame(SEX=sex, HEIGHT=height, WEIGHT=weight) )SEX HEIGHT WEIGHT

1 F 158 512 <NA> 162 553 M NA 72

Page 60: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

60

★ 欠損の扱い(2)

ファイルからデータを読み込む場合で欠損が含まれているデータを読み込む場合は,データ間がコンマで区切られている方が処理しやすい.この場合,単に欠損部分を空白にしておけば,該当部分に欠損値(NA)が入る.

x <- read.table("data06.txt", header=T, sep=",")

sex height weight1 F 158 512 F 162 553 M NA 724 M 173 575 M 166 64

sex,height,weightF,158,51F,162,55M, ,72M,173,57M,166,64

data06.txt

Page 61: 統数研シンポジウム R 061109jasp.ism.ac.jp/kinou2sg/contents/ISM_symposium_R_2006.pdf0.20 0.25 60 65 70 75 80 Bass 2 Bass 1 Tenor 2 0.00 0.05 0.10 0.15 0.20 0.25 Tenor 1 0.00

で データハンドリング