でデータハンドリング

で データハンドリング
~ データフレーム 30 分クッキング ~
本日のメニュー
„ データフレームとは ←
„ データフレームの作成
„ データハンドリングの方法と例
60
Soprano 2
65
70
75
80
Soprano 1
Density
0.25
0.20
0.15
0.10
0.05
0.00
0.25
0.20
0.15
0.10
0.05
0.00
Alto 2
Alto 1
Tenor 2
Tenor 1
0.25
0.20
0.15
0.10
0.05
0.00
Bass 2
Bass 1
0.25
0.20
0.15
0.10
0.05
0.00
60
65
70
75
80
height
2
データフレームとは
„ 統計解析を行うデータの形式は様々
‰ ( R 上で)データを手で入力して・・・
‰ テキストファイル,EXCEL,ACCESS,SAS などの形式
„ R でデータ解析を行う際は,データフレームという形式
にデータを変換することが多い(見た目は行列)
EXCEL:シート
ACCESS:テーブル
SAS:データセット
3
データフレームとは
„ 数値ベクトルや文字ベクトル,
因子ベクトルなどの異なる型の
データをまとめてもつ変数
⇒ 外見は行列と同じ
⇒ 各列の要素の型はバラバラ
でも構わない
„ データフレームの各行・各列は
ラベルを必ず持ち,ラベルに
よる操作が可能
SEX HEIGHT WEIGHT
F
158
51
F
162
55
M
177
72
M
173
57
M
166
64
4
本日のメニュー
„ データフレームとは
„ データフレームの作成 ←
„ データハンドリングの方法と例
2.5
2.0 1.52.02.5
1.5
Petal.Width
1.0
0.00.51.0 0.5
0.0
4.5
4.0
3.5
7
6
4 5 6 7
5
4
4
Petal.Length
3
2
1 2 3 4
1
3.54.04.5
Sepal.Width
3.0
2.02.53.0 2.5
2.0
8
7
7
8
Sepal.Length
6
5
6
5
Scatter Plot Matrix
5
データフレームの作成
„ R でベクトルデータを作成した後,データフレームを作成
(いわゆる手入力)
⇒ 「性別」「身長」「体重」データをベクトルで用意
した後,関数 data.frame() で1つのデータフレーム
に変換する
„ ファイルからデータを読み込んで,データフレームを作成
⇒ 関数 read.table() などでファイルからデータを読込
⇒ パッケージ RODBC の関数 odbcConnectXXXXX() で
データファイルにアクセスした後,関数 sql.Query()
でファイルからデータを読込
6
データフレームの作成(手入力)
SEX
HEIGHT
WEIGHT
SEX
F
158
51
F
158
51
F
162
55
F
162
55
M
177
72
M
177
72
M
173
57
M
173
57
M
166
64
M
166
64
data.frame()
HEIGHT WEIGHT
> 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)
7
データフレームの閲覧
„ データフレームの中身を確認したいときは・・・
‰ R のコンソール画面で
‰ R 標準のデータエディタで (←データを見ながらの作業不可)
‰ relimp パッケージのテキストウインドウで
コンソール上
> x
データエディタ
> edit(x)
テキストウインドウ
> library(relimp)
> showData(x)
8
データフレームを作成すると・・・
> summary(x)
SEX
F:2
M:3
# データフレームの列ごとの特徴を見る
HEIGHT
Min.
:158.0
1st Qu.:162.0
Median :166.0
Mean
:167.2
3rd Qu.:173.0
Max.
:177.0
WEIGHT
Min.
:51.0
1st Qu.:55.0
Median :57.0
Mean
:59.8
3rd Qu.:64.0
Max.
:72.0
SEX
HEIGHT
WEIGHT
F
158
51
F
162
55
M
177
72
M
173
57
M
166
64
# 密度関数のプロット
> library(lattice)
> densityplot( height │ voice.part, data=singer, layout=c(2,4))
# 対散布図
> splom( iris[1:4], groups = Species, data = iris,
+
panel = panel.superpose)
9
データフレームの作成(⇔ .txt )
„ 関数 read.table() などでテキストファイルからデータを
読み込むことが出来る
> x <- read.table("data04.txt",
header=T, sep="," )
sex height weight
1
F
158
51
2
F
162
55
3
M
177
72
4
M
173
57
5
M
166
64
> x <- read.csv("data04.txt")
sex,height,weight
F,158,51
F,162,55
M,177,72
M,173,57
M,166,64
data04.txt
10
データフレームの作成(RODBC)
„ パッケージ RODBC の中の関数 odbcConnectXXXXX() で
データファイルにアクセスした後,関数 sql.Query() で
ファイルからデータを読み込むことが出来る
>
>
>
>
>
>
>
library(RODBC)
tmp <- odbcConnectExcel("c:/data00.xls")
tmp <- odbcConnectAccess("c:/data00.mdb")
sqlTables(tmp)
x <- sqlQuery(tmp,"select * from [Sheet1$]")
x <- sqlQuery(tmp,"select * from [mydata]")
odbcClose(tmp)
#
#
#
#
#
#
#
パッケージの呼出
データに接続
(Access の場合)
テーブルを表示
読み込み
(Access の場合)
接続を遮断
„ 他にも ORACLE のデータベースや,その他のデータ形式
ファイル(DBASE,MySQL,PostgreSQL)からデータ
フレームを作成することもできる
11
データフレームの作成(foreign)
„ パッケージ foreign の中には,外部データを読み込む
ための関数が多数用意されている
関数
data.restore()
read.dbf()
read.dta()
read.epiinfo()
read.mtp()
read.octave()
read.spss()
read.ssd()
read.systat()
read.xport()
用途
Read an S3 Binary File
Read a DBF File
Read Stata Binary Files
Read Epi Info Data Files
Read a Minitab Portable Worksheet
Read Octave Text Data Files
Read an SPSS Data File
Obtain a Data Frame from a SAS Permanent
Obtain a Data Frame from a Systat File
Read a SAS XPORT Format Library
12
データフレームの作成(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")
13
本日のメニュー
„ データフレームとは
„ データフレームの作成
„ データハンドリングの方法と例 ←
14
データハンドリング例(導入)
„ Aさん~D女史 (変数はNAME) の 4 人に,やせ薬
(GROUP==Active) か偽薬 (GROUP==Placebo) を投薬する
„ 投薬してから1日目(DAY==1)~3日目(DAY==3)に体重を測定する
„ 体重は,午前 (KG_AM) と午後 (KG_PM) の1日2回測定する
NAME
Aさん
Cくん
D女史
B氏
B氏
Aさん
D女史
Cくん
Cくん
Aさん
B氏
D女史
DAY
1
1
1
1
2
2
2
2
3
3
3
3
KG_AM
65.2
71.3
62.7
58.5
58.1
65.8
61.2
71.2
69.8
63.5
59.0
59.8
KG_PM
66.6
71.5
61.7
58.0
59.5
64.0
61.4
70.2
71.2
61.5
58.6
59.9
NAME
Aさん
Cくん
D女史
B氏
GROUP
Active
Placebo
Active
Placebo
15
データハンドリング例(導入)
„ データの形式は EXCEL
„ 体重に関するデータとグループに関するデータの 2 つ
„ まずは 2 つのデータセットを R に読み込ませる
data1.xls ⇒ データフレーム x1 に
NAME
Aさん
Cくん
D女史
B氏
B氏
Aさん
D女史
Cくん
Cくん
Aさん
B氏
D女史
DAY
1
1
1
1
2
2
2
2
3
3
3
3
KG_AM
65.2
71.3
62.7
58.5
58.1
65.8
61.2
71.2
69.8
63.5
59.0
59.8
data2.xls ⇒ x2 に
KG_PM
66.6
71.5
61.7
58.0
59.5
64.0
61.4
70.2
71.2
61.5
58.6
59.9
NAME
Aさん
Cくん
D女史
B氏
GROUP
Active
Placebo
Active
Placebo
16
データハンドリング例(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)
# 接続を遮断
読み込み
17
データハンドリング例(2)
### データフレーム x1 と x2 を併合(マージ)する
### 本当は列について自動で整列されるが,あえて整列させない
> x <- merge(x1, x2, by="NAME", all=T, sort=F)
データフレーム x
NAME
Aさん
Cくん
D女史
B氏
B氏
Aさん
D女史
Cくん
Cくん
Aさん
B氏
D女史
DAY
1
1
1
1
2
2
2
2
3
3
3
3
KG_AM
KG_PM
65.2
71.3
62.7
58.5
58.1
65.8
61.2
71.2
69.8
63.5
59.0
59.8
GROUP
66.6
71.5
61.7
58.0
59.5
64.0
61.4
70.2
71.2
61.5
58.6
59.9
Active
Placebo
Active
Placebo
Placebo
Active
Active
Placebo
Placebo
Active
Placebo
Active
18
データハンドリング例(3)
### 列の順番を入れ替える
> x <- x[,c(1,5,2,3,4)]
> x <- x[,c("NAME","GROUP","DAY","KG_AM","KG_PM")]
データフレーム x
NAME
Aさん
Cくん
D女史
B氏
B氏
Aさん
D女史
Cくん
Cくん
Aさん
B氏
D女史
GROUP
Active
Placebo
Active
Placebo
Placebo
Active
Active
Placebo
Placebo
Active
Placebo
Active
DAY
1
1
1
1
2
2
2
2
3
3
3
3
KG_AM
KG_PM
65.2
71.3
62.7
58.5
58.1
65.8
61.2
71.2
69.8
63.5
59.0
59.8
66.6
71.5
61.7
58.0
59.5
64.0
61.4
70.2
71.2
61.5
58.6
59.9
19
データハンドリング例(4)
### 行についてデータを NAME で整列(ソート;1変数)する
> sortlist <- order(x$NAME)
# 順番を取得
> X <- x[sortlist,]
# 整列
> rownames(X) <- c(1:nrow(X))
# 行番号の整形
データフレーム X
NAME
Aさん
Aさん
Aさん
B氏
B氏
B氏
Cくん
Cくん
Cくん
D女史
D女史
D女史
GROUP
Active
Active
Active
Placebo
Placebo
Placebo
Placebo
Placebo
Placebo
Active
Active
Active
DAY
KG_AM
KG_PM
1
2
3
1
2
3
1
2
3
1
2
3
65.2
65.8
63.5
58.5
58.1
59.0
71.3
71.2
69.8
62.7
61.2
59.8
66.6
64.0
61.5
58.0
59.5
58.6
71.5
70.2
71.2
61.7
61.4
59.9
20
データハンドリング例(目的は・・・)
NAME
Aさん
Aさん
Aさん
B氏
B氏
B氏
Cくん
Cくん
Cくん
D女史
D女史
D女史
GROUP
Active
Active
Active
Placebo
Placebo
Placebo
Placebo
Placebo
Placebo
Active
Active
Active
DAY
KG_AM
KG_PM
1
2
3
1
2
3
1
2
3
1
2
3
65.2
65.8
63.5
58.5
58.1
59.0
71.3
71.2
69.8
62.7
61.2
59.8
66.6
64.0
61.5
58.0
59.5
58.6
71.5
70.2
71.2
61.7
61.4
59.9
「3日目の体重の平均」と
「1日目の体重の平均」の
変化量が -2kg 未満の人
を抽出する
NAME
Aさん
D女史
21
データハンドリング例(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)
NAME
Aさん
Aさん
Aさん
B氏
B氏
B氏
Cくん
Cくん
Cくん
D女史
D女史
D女史
GROUP
Active
Active
Active
Placebo
Placebo
Placebo
Placebo
Placebo
Placebo
Active
Active
Active
DAY
KG_AM
KG_PM
1
2
3
1
2
3
1
2
3
1
2
3
65.2
65.8
63.5
58.5
58.1
59.0
71.3
71.2
69.8
62.7
61.2
59.8
66.6
64.0
61.5
58.0
59.5
58.6
71.5
70.2
71.2
61.7
61.4
59.9
MEAN
65.90
64.90
62.50
58.25
58.80
58.80
71.40
70.70
70.50
62.20
61.30
59.85
22
データハンドリング例(6)
### 列の数を絞る transform(データフレーム[,残す列])
> X2 <- transform(X1[,c(1,2,3,6)])
### 列の数を絞る subset(データフレーム名,
###
select=-c(削る列1,削る列2, ...))
> X2 <- subset(X1, select = -c(KG_AM, KG_PM))
NAME
Aさん
Aさん
Aさん
B氏
B氏
B氏
Cくん
Cくん
Cくん
D女史
D女史
D女史
GROUP
Active
Active
Active
Placebo
Placebo
Placebo
Placebo
Placebo
Placebo
Active
Active
Active
DAY
1
2
3
1
2
3
1
2
3
1
2
3
MEAN
65.90
64.90
62.50
58.25
58.80
58.80
71.40
70.70
70.50
62.20
61.30
59.85
23
データハンドリング例(7)
###「DAY毎の平均」という列を追加
### 横展開する関数 reshape(データフレーム名, idvar=固定する列,
###
timevar=横展開する列, direction="wide")
> X3 <- reshape(X2, idvar =c("NAME","GROUP"),
+
timevar="DAY", direction="wide")
NAME
GROUP
MEAN.1
MEAN.2
MEAN.3
Aさん
Active
65.90
64.9
62.50
B氏
Placebo
58.25
58.8
58.80
Cくん
Placebo
71.40
70.7
70.50
D女史
Active
62.20
61.3
59.85
24
データハンドリング例(8)
###「3日目の体重の平均」−「1日目の体重の平均」
### という列「DIFF」を作成した後,列の数を絞る
> X4 <- transform(X3[,c("NAME","GROUP")],
DIFF = (X3$MEAN.3 - X3$MEAN.1) )
NAME
GROUP
DIFF
Aさん
Active
-3.40
B氏
Placebo
0.55
Cくん
Placebo
-0.90
D女史
Active
-2.35
25
データハンドリング例(9)
### 体重の変化量が -2kg 未満:subset(データフレーム, 条件式)
> subset(X4, DIFF < -2)
NAME
GROUP
DIFF
Aさん
Active
-3.40
D女史
Active
-2.35
### 体重の変化量が -2kg 未満の人:subset(データ, 条件式, 列名)
> subset(X4, DIFF < -2, c(NAME))
NAME
Aさん
D女史
26
データハンドリング例(10)
### ちなみに,B 氏と C くんを取り出す場合は・・・:
### subset(データフレーム, 列名 %in% 集合ベクトル)
> subset(X4, NAME %in% c("B氏","Cくん"))
NAME
GROUP
DIFF
B氏
Placebo
0.55
Cくん
Placebo
-0.90
### ちなみに,これはエラーとなる・・・
> subset(X4, DIFF<-2)
27
本日のメニュー
„ データフレームとは
‰ 統計解析を行うためのデータの形式
‰ 見た目は行列 ⇒ でも使い勝手が良い
„ データフレームの作成
‰ 手入力でもデータの読み込み可だけど・・・
‰ 外部データ(テキストファイル, EXCEL,ACCESS,
SAS,・・・)からでも読み込み可
„ データハンドリングの方法と例
‰ RODBC を使ったデータ読み込みの例を紹介
‰ データのマージ,ソート,変数追加,変数削除,
データの横展開,条件抽出の例を紹介
28
【おまけ】実務で R にデータを読み込む際・・・
① 〔EXCEL〕→〔RODBCでデータフレームにする〕
② 〔EXCEL〕→〔CSVに変換〕
→〔関数 read.table() でデータフレームにする〕
②'〔他のアプリ〕→〔テキストデータ〕
→〔関数 read.table() でデータフレームにする〕
③〔SAS〕→〔xptに変換〕→〔read.xport()でデータフレームにする〕
(SAS でできないことを R にさせるという意図)
④ SQLでデータベースにも直接アクセスできるはず
⑤ XMLでデータを入力,出力させることもできるはず
★データがちゃんと入力されているかを確認する方法は?
・「データフレームから抜き取り」とか「要約統計量」とか
・「次元の数」と「一番右下のセルに値が正しく入っているか」を確認
・欠測の数を数える
・EXCEL に出力して比較(コンペア)する
・R から折り返しはきだし,SAS 上で比較(コンペア)する
29
参考文献&謝辞
„ 参考文献
‰THE R BOOK 4章(岡田昌史 他;九天社)
‰データ解析環境 R 5章(舟尾,高浪;工学社)
‰パッケージ「RODBC」「foreign」のヘルプ
„ 発表資料作成の際にお世話になった人
‰北西 由武さん(塩野義製薬)
‰高浪 洋平さん(武田薬品工業)
30
で データハンドリング
~ データフレーム 30 分クッキング ~
終
で データハンドリング
~ ここからはおまけ ~
★ 作業ディレクトリの変更
„ ファイルからデータを読み込むには・・・
‰ まず,データがあるディレクトリ(フォルダ)に作業ディレクトリ
を変更する
‰ 次に,関数 read.table() などでファイルからデータを読み込む
„ ファイルからデータやプログラムを読み込んだり,
ファイルにデータを書き出したりする場所を
作業ディレクトリという
„ 指定したディレクトリに指定した作業ディレクトリに
データがセーブされたり,R 用エディタなどが保存
されるようになる
> setwd("c:/usr")
> getwd()
[1] "c:/usr"
# 作業ディレクトリを変更
# 現在のディレクトリを確認
33
★ 作業ディレクトリの変更 (Windows)
[ファイル] の [ディレクトリの変更]
を選択
[Browse] をクリックして,
変更先のディレクトリを選択
34
★ 作業ディレクトリの変更 (Mac OS X)
[その他] の 作業[ディレクトリの変更]
を選択
変更先のディレクトリを選択
35
★ テキストファイル ⇒ データフレーム
(1) 列名がなく,データ間がスペースで区切ら
れている場合
⇒ R が勝手に列名を決めている
> x <- read.table("data01.txt")
1
2
3
4
5
V1
F
F
M
M
M
V2
158
162
177
173
166
V3
51
55
72
57
64
F
F
M
M
M
158
162
177
173
166
51
55
72
57
64
data01.txt
36
★ テキストファイル ⇒ データフレーム
(2) 列名があり,データ間がスペースで区切ら
れている場合
> x <- read.table("data02.txt",
header=T )
sex height weight
1
F
158
51
2
F
162
55
3
M
177
72
4
M
173
57
5
M
166
64
sex height weight
F
158
51
F
162
55
M
177
72
M
173
57
M
166
64
data02.txt
37
★ テキストファイル ⇒ データフレーム
(3)1行目にコメント,2行目に列名があり,
データ間がスペースで区切られている場合
> x <- read.table("data03.txt",
header=T, skip=1 )
sex height weight
1
F
158
51
2
F
162
55
3
M
177
72
4
M
173
57
5
M
166
64
### data03.txt
sex height weight
F
158
51
F
162
55
M
177
72
M
173
57
M
166
64
data03.txt
38
★ テキストファイル ⇒ データフレーム
(4) 列名があり,データ間がコンマで区切ら
れている場合
> x <- read.table("data04.txt",
header=T, sep="," )
sex height weight
1
F
158
51
2
F
162
55
3
M
177
72
4
M
173
57
5
M
166
64
sex,height,weight
F,158,51
F,162,55
M,177,72
M,173,57
M,166,64
data04.txt
39
★ テキストファイル ⇔ EXCEL
„ 目的は関数 read.csv() で読み込める形式に
すること(前節の data04.txt の状態)
‰まず,EXCEL ファイルを開き,メニューの
[ファイル] の [開く] から,[名前をつけて保存]
を選択する
‰保存する名前をつけた後,次に [ファイルの種類]
から [CSV カンマ区切り]を選択して保存する
40
★ テキストファイル ⇔ EXCEL
„ Windows 版 R の場合
別名で保存
CSV(カンマ区切り)で保存
41
★ テキストファイル ⇔ EXCEL
„ Mac OS X 版 R の場合
別名で保存
CSV(カンマ区切り)で保存
42
★ テキストファイル ⇔ EXCEL
(4’) 列名があり,データ間がコンマで区切ら
れている場合
> x <- read.csv("data04.csv")
1
2
3
4
5
sex height weight
F
158
51
F
162
55
M
177
72
M
173
57
M
166
64
sex,height,weight
F,158,51
F,162,55
M,177,72
M,173,57
M,166,64
data04.csv
43
★ テキストファイル ⇔ EXCEL
(5) 列名がなく,データ間がコンマで区切ら
れている場合
> myname <- c("SEX","HEIGHT","WEIGHT")
> x <- read.csv("data05.csv",
header=F, col.names=myname )
sex height weight
1
F
158
51
2
F
162
55
3
M
177
72
4
M
173
57
5
M
166
64
F,158,51
F,162,55
M,177,72
M,173,57
M,166,64
data05.csv
44
★ データフレームの作成
〔EXCELのセルをコピー&ペースト〕
„ Windows 版の場合は,列名をコピーしても
しなくてもよい
# 列名をコピーした場合
x <- read.delim("clipboard", header=
T
)
F
)
# 列名をコピーしなかった場合
x <- read.delim("clipboard", header=
45
★ データフレームの作成
〔EXCELのセルをコピー&ペースト〕
„ Mac OS X 版の場合は,列名をコピーしては
いけない
excel.mac <- function(...) {
args <- c(...)
temp <- matrix(scan(""), byrow=TRUE,
ncol=length(args))
data <- data.frame(temp)
colnames(data) <- args
return(data)
}
excel.mac("X", "Y") # 列名を入力
1:
# ペーストする 46
★ 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 1
222 DEF 2
333 GHI 1
444 JKL 2
;
proc copy in=work out=xxx ; select demo ; run;
47
★ SAS ⇒ XML ⇒ R (2)
„ 次に XML ⇒ R へ読み込む
‰ パッケージ SASXML の中に入っているソース
eventSAS.S,sas.S,sasDataset.R を実行する
‰その後,以下を実行する
> library(XML)
> x <- sas("C:/demo.xml")
> x$DEMO
1
2
3
4
id
111
222
333
444
name
ABC
DEF
GHI
JKL
sex
Female
Male
Female
Male
48
★
>
>
>
>
>
<寄り道>
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
1
2
X
1
2
Y
Yes
No
49
★
<寄り道>
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 の出力
50
★
<寄り道>
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 の出力
51
★ データへのアクセス方法(1)
コマンド
機能
x$列名,x[“列名”],
x[["列名"]]
指定した列データを表示
x[2], x[[2]]
2 番目の列データを表示
x[3, 2], x[[3, 2]]
3 行 2 列目のデータを表示
x[[3,"列名"]], x[[3,"列名"]]
指定した列の 3 行目のデータを表示
x[c(1, 2)]
1 列目と 2 列目のデータを表示
x[c(3, 4), ]
3 行目と 4 行目のデータを表示
x[ ,c(T,F,T)]
x[SEX=="F", ]
x[ ,SEX=="F" & WEIGHT>50 ]
論理ベクトル c(T,F,T) が TRUE と
なっている列を表示
性別が F(女性)である行を表示
性別が F(女性)かつ体重が 50kg
より大きい行を表示
52
★ データへのアクセス方法(2)
„ データフレーム[行番号,列番号] で指定する
x[c(1,3,5),]
sex height weight
1
F
158
51
3
M
177
72
5
M
166
64
# 1,3,5行目にアクセス
x[,c(1,3)]
sex weight
1
F
51
2
F
55
3
M
72
4
M
57
5
M
64
# 1,3列目にアクセス
データフレーム x
SEX
HEIGHT
WEIGHT
F
158
51
F
162
55
M
177
72
M
173
57
M
166
64
53
★ データへのアクセス方法(3)
„ データフレーム$列名 で指定する
> x$height
# 身長データ
[1] 158 162 177 173 166
データフレーム x
SEX
> x$height <- NULL
> x
sex weight
1
F
51
2
F
55
3
M
72
4
M
57
5
M
64
# 身長を削除
HEIGHT
WEIGHT
F
158
51
F
162
55
M
177
72
M
173
57
M
166
64
54
★ データの加工・抽出(1)
コマンド
機能
ncol(x)
x の列数(変数の数)を求める
nrow(x)
x の行数(データ数)を求める
names(x)
x の列名を表示する
rbind(x,y)
x と y を縦に並べて結合する
cbind(x,y)
x と y を横に並べて結合する
data.frame(x,y) x と y を横に並べて結合する
merge(x,y)
x と y を併合(マージ)する.
※通常は引数に all=T を指定し,データを全て
残す.all=T を指定しなければデータの共通
部分が結果として返される.
55
★ データの加工・抽出(2)
コマンド
機能
head(x, n=a)
先頭から a 行だけ抽出する
tail(x, n=b)
末尾から b 行だけ抽出する
na.omit(x)
NA を含む行を削除する
transform(x, y=ベクトル)
データフレーム x に新たな列 y を追加する
subset(x, 条件式)
条件式に合う行のみを抽出する
subset(x, 条件式, ベクトル)
ベクトルで指定した列に対し,条件式に合
う行のみを抽出する
56
★ データのマージ
### データフレーム x1 と x2 を併合(マージ)する
> x <- merge(x1, x2, by="NAME", all=T, sort=F)
### x1 と x3 で,マージするためのキー変数が異なる場合
> x <- merge(x1, x3, by.x="NAME", by.y="NAME2")
x1
NAME
Aさん
Cくん
D女史
B氏
B氏
Aさん
D女史
Cくん
Cくん
Aさん
B氏
D女史
DAY
1
1
1
1
2
2
2
2
3
3
3
3
x2
KG_AM
65.2
71.3
62.7
58.5
58.1
65.8
61.2
71.2
69.8
63.5
59.0
59.8
KG_PM
66.6
71.5
61.7
58.0
59.5
64.0
61.4
70.2
71.2
61.5
58.6
59.9
NAME
+
GROUP
Aさん
Cくん
D女史
B氏
Active
Placebo
Active
Placebo
x3
NAME2
+
Aさん
Cくん
D女史
B氏
GROUP
Active
Placebo
Active
Placebo
57
★ データのソート(2変数のソート)
### 行についてデータを整列(ソート;2変数)する
### sortlist <- order(第1変数, 第2変数)
> sortlist <- order(x$GROUP, x$DAY)
# 順番を取得
> X <- x[sortlist,]
# 整列
> rownames(X) <- c(1:nrow(X))
# 行番号の整形
> X
NAME
Aさん
D女史
Aさん
D女史
Aさん
D女史
B氏
Cくん
B氏
Cくん
B氏
Cくん
GROUP
Active
Active
Active
Active
Active
Active
Placebo
Placebo
Placebo
Placebo
Placebo
Placebo
DAY
1
1
2
2
3
3
1
1
2
2
3
3
KG_AM
65.2
62.7
65.8
61.2
63.5
59.8
58.5
71.3
58.1
71.2
59.0
69.8
KG_PM
66.6
61.7
64.0
61.4
61.5
59.9
58.0
71.5
59.5
70.2
58.6
71.2
58
★ 欠損の扱い(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
51
2 <NA>
162
55
3
M
NA
72
59
★ 欠損の扱い(2)
„ ファイルからデータを読み込む場合で欠損が含
まれているデータを読み込む場合は,データ間
がコンマで区切られている方が処理しやすい.
„ この場合,単に欠損部分を空白にしておけば,
該当部分に欠損値(NA)が入る.
x <- read.table("data06.txt",
header=T, sep=",")
sex height weight
1
F
158
51
2
F
162
55
3
M
NA
72
4
M
173
57
5
M
166
64
sex,height,weight
F,158,51
F,162,55
M,
,72
M,173,57
M,166,64
data06.txt
60
で データハンドリング
終