で データハンドリング
~ データフレーム 30 分クッキング ~
2
本日のメニュー
データフレームとは ←
データフレームの作成
データハンドリングの方法と例
height
Density
0.000.05 0.100.15 0.200.25
60 65 70 75 80
Bass 2 Bass 1
Tenor 2
0.000.05 0.100.15 0.200.25
Tenor 1
0.000.05 0.100.15 0.200.25
Alto 2 Alto 1
Soprano 2
60 65 70 75 80
0.000.05 0.100.15 0.200.25
Soprano 1
3
データフレームとは
EXCEL:シート ACCESS:テーブル SAS:データセット
統計解析を行うデータの形式は様々
( R 上で)データを手で入力して・・・
テキストファイル, EXCEL , ACCESS , SAS などの形式
R でデータ解析を行う際は,データフレームという形式
にデータを変換することが多い(見た目は行列)
4
データフレームとは
数値ベクトルや文字ベクトル,
因子ベクトルなどの異なる型の データをまとめてもつ変数
⇒ 外見は行列と同じ
⇒ 各列の要素の型はバラバラ でも構わない
データフレームの各行・各列は ラベルを必ず持ち,ラベルに よる操作が可能
64 166
M
57 173
M
72 177
M
55 162
F
51 158
F
WEIGHT HEIGHT
SEX
5
本日のメニュー
データフレームとは
データフレームの作成 ←
データハンドリングの方法と例
Scatter Plot Matrix Sepal.Length
7 8
7 8
5 6 5 6
Sepal.Width3.5 4.0
4.5
3.54.04.5
2.0 2.5 3.0 2.02.53.0
Petal.Length4 5
6 7
4 5 6 7
1 2 3 4 1 2 3 4
Petal.Width1.5 2.0
2.5
1.52.02.5
0.0 0.5 1.0 0.00.51.0
6
データフレームの作成
R でベクトルデータを作成した後,データフレームを作成
(いわゆる手入力)
⇒ 「性別」「身長」「体重」データをベクトルで用意 した後,関数 data.frame() で1つのデータフレーム に変換する
ファイルからデータを読み込んで,データフレームを作成
⇒ 関数 read.table() などでファイルからデータを読込
⇒ パッケージ RODBC の関数 odbcConnectXXXXX() で
データファイルにアクセスした後,関数 sql.Query()
でファイルからデータを読込
7
M M M F F SEX
64 57 72 55 51 WEIGHT
166 173 177 162 158 HEIGHT
64 166
M
57 173
M
72 177
M
55 162
F
51 158
F
WEIGHT HEIGHT
SEX
> 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()
データフレームの作成(手入力)
8
データフレームの閲覧
データフレームの中身を確認したいときは・・・
R のコンソール画面で
R 標準のデータエディタで ( ←データを見ながらの作業不可 )
relimp パッケージのテキストウインドウで
データエディタ
> edit(x)
テキストウインドウ
> library(relimp)
> showData(x)
コンソール上
> x
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)
64 166
M
57 173
M
72 177
M
55 162
F
51 158
F
WEIGHT HEIGHT
SEX
10
データフレームの作成(⇔ .txt )
> 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
関数 read.table() などでテキストファイルからデータを
読み込むことが出来る
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 )からデータ
フレームを作成することもできる
12
データフレームの作成( foreign )
Read a SAS XPORT Format Library read.xport()
Obtain a Data Frame from a Systat File read.systat()
Obtain a Data Frame from a SAS Permanent read.ssd()
Read an SPSS Data File read.spss()
Read Octave Text Data Files read.octave()
Read a Minitab Portable Worksheet read.mtp()
Read Epi Info Data Files read.epiinfo()
Read Stata Binary Files read.dta()
Read a DBF File read.dbf()
Read an S3 Binary File data.restore()
用途 関数
パッケージ foreign の中には,外部データを読み込む
ための関数が多数用意されている
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")
14
本日のメニュー
データフレームとは
データフレームの作成
データハンドリングの方法と例 ←
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
Placebo Active Placebo Active
GROUP
D女史 B氏 Aさん Cくん Cくん D女史 Aさん B氏 B氏 D女史 Cくん Aさん
NAME
59.9 59.8
3
58.6 59.0
3
61.5 63.5
3
71.2 69.8
3
70.2 71.2
2
61.4 61.2
2
64.0 65.8
2
59.5 58.1
2
58.0 58.5
1
61.7 62.7
1
71.5 71.3
1
66.6 65.2
1
KG̲PM KG̲AM
DAY
16
データハンドリング例(導入)
B氏 D女史 Cくん Aさん
NAME
Placebo Active Placebo Active
GROUP
データの形式は EXCEL
体重に関するデータとグループに関するデータの 2 つ
まずは 2 つのデータセットを R に読み込ませる
D女史 B氏 Aさん Cくん Cくん D女史 Aさん B氏 B氏 D女史 Cくん Aさん
NAME
59.9 59.8
3
58.6 59.0
3
61.5 63.5
3
71.2 69.8
3
70.2 71.2
2
61.4 61.2
2
64.0 65.8
2
59.5 58.1
2
58.0 58.5
1
61.7 62.7
1
71.5 71.3
1
66.6 65.2
1
KG̲PM KG̲AM
DAY
data1.xls ⇒ データフレーム x1 に data2.xls ⇒ x2 に
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) # 接続を遮断
読み込み
18
データハンドリング例(2)
### データフレーム x1 と x2 を併合(マージ)する
### 本当は列について自動で整列されるが,あえて整列させない
> x <‑ merge(x1, x2, by="NAME", all=T, sort=F) データフレーム x
59.9 58.6 61.5 71.2 70.2 61.4 64.0 59.5 58.0 61.7 71.5 66.6
KG̲PM
D女史 B氏 Aさん Cくん Cくん D女史 Aさん B氏 B氏 D女史 Cくん Aさん
NAME
Active 59.8
3
Placebo 59.0
3
Active 63.5
3
Placebo 69.8
3
Placebo 71.2
2
Active 61.2
2
Active 65.8
2
Placebo 58.1
2
Placebo 58.5
1
Active 62.7
1
Placebo 71.3
1
Active 65.2
1
GROUP KG̲AM
DAY
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.9 59.8
3 Active
58.6 59.0
3 Placebo
61.5 63.5
3 Active
71.2 69.8
3 Placebo
70.2 71.2
2 Placebo
61.4 61.2
2 Active
64.0 65.8
2 Active
59.5 58.1
2 Placebo
58.0 58.5
1 Placebo
61.7 62.7
1 Active
71.5 71.3
1 Placebo
66.6 65.2
1 Active
KG̲PM KG̲AM
DAY GROUP
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.9 59.8
3 Active
61.4 61.2
2 Active
61.7 62.7
1 Active
71.2 69.8
3 Placebo
70.2 71.2
2 Placebo
71.5 71.3
1 Placebo
58.6 59.0
3 Placebo
59.5 58.1
2 Placebo
58.0 58.5
1 Placebo
61.5 63.5
3 Active
64.0 65.8
2 Active
66.6 65.2
1 Active
KG̲PM KG̲AM
DAY GROUP
データフレーム X
21
データハンドリング例(目的は・・・)
D女史 D女史 D女史 Cくん Cくん Cくん B氏 B氏 B氏 Aさん Aさん Aさん
NAME
59.9 59.8
3 Active
61.4 61.2
2 Active
61.7 62.7
1 Active
71.2 69.8
3 Placebo
70.2 71.2
2 Placebo
71.5 71.3
1 Placebo
58.6 59.0
3 Placebo
59.5 58.1
2 Placebo
58.0 58.5
1 Placebo
61.5 63.5
3 Active
64.0 65.8
2 Active
66.6 65.2
1 Active
KG̲PM KG̲AM
DAY GROUP
D女史 Aさん
NAME
「
3日目の体重の平均」と
「
1日目の体重の平均」の 変化量が
-2kg未満の人
を抽出する
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.9 61.4 61.7 71.2 70.2 71.5 58.6 59.5 58.0 61.5 64.0 66.6
KG̲PM
D女史 D女史 D女史 Cくん Cくん Cくん B氏 B氏 B氏 Aさん Aさん Aさん
NAME
59.85 59.8
3 Active
61.30 61.2
2 Active
62.20 62.7
1 Active
70.50 69.8
3 Placebo
70.70 71.2
2 Placebo
71.40 71.3
1 Placebo
58.80 59.0
3 Placebo
58.80 58.1
2 Placebo
58.25 58.5
1 Placebo
62.50 63.5
3 Active
64.90 65.8
2 Active
65.90 65.2
1 Active
MEAN KG̲AM
DAY GROUP
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.85 3
Active
61.30 2
Active
62.20 1
Active
70.50 3
Placebo
70.70 2
Placebo
71.40 1
Placebo
58.80 3
Placebo
58.80 2
Placebo
58.25 1
Placebo
62.50 3
Active
64.90 2
Active
65.90 1
Active
MEAN DAY
GROUP
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.85 62.20
Active
70.50 71.40
Placebo
58.80 58.25
Placebo
62.50 65.90
Active
MEAN.3 MEAN.1
GROUP
25
データハンドリング例(8)
###「3日目の体重の平均」−「1日目の体重の平均」
### という列「DIFF」を作成した後,列の数を絞る
> X4 <‑ transform(X3[,c("NAME","GROUP")],
DIFF = (X3$MEAN.3 ‑ X3$MEAN.1) )
D女史 Cくん B氏 Aさん
NAME
‑2.35 Active
‑0.90 Placebo
0.55 Placebo
‑3.40 Active
DIFF GROUP
26
データハンドリング例(9)
### 体重の変化量が ‑2kg 未満:subset(データフレーム, 条件式)
> subset(X4, DIFF < ‑2)
### 体重の変化量が ‑2kg 未満の人:subset(データ, 条件式, 列名)
> subset(X4, DIFF < ‑2, c(NAME))
D女史 Aさん
NAME
‑2.35 Active
‑3.40 Active
DIFF GROUP
D女史 Aさん
NAME
27
データハンドリング例(10)
### ちなみに,B 氏と C くんを取り出す場合は・・・:
### subset(データフレーム, 列名 %in% 集合ベクトル)
> subset(X4, NAME %in% c("B氏","Cくん"))
### ちなみに,これはエラーとなる・・・
> subset(X4, DIFF<‑2)
Cくん B氏
NAME
‑0.90 Placebo
0.55 Placebo
DIFF GROUP
28
本日のメニュー
データフレームとは
統計解析を行うためのデータの形式
見た目は行列 ⇒ でも使い勝手が良い
データフレームの作成
手入力でもデータの読み込み可だけど・・・
外部データ(テキストファイル, EXCEL , ACCESS , SAS ,・・・)からでも読み込み可
データハンドリングの方法と例
RODBC を使ったデータ読み込みの例を紹介
データのマージ,ソート,変数追加,変数削除,
データの横展開,条件抽出の例を紹介
29
【おまけ】実務で R にデータを読み込む際・・・
① 〔EXCEL〕→〔RODBCでデータフレームにする〕
② 〔EXCEL〕→〔CSVに変換〕
→〔関数 read.table() でデータフレームにする〕
②'〔他のアプリ〕→〔テキストデータ〕
→〔関数 read.table() でデータフレームにする〕
③〔SAS〕→〔xptに変換〕→〔read.xport()でデータフレームにする〕
(SAS でできないことを R にさせるという意図)
④ SQLでデータベースにも直接アクセスできるはず
⑤ XMLでデータを入力,出力させることもできるはず
★データがちゃんと入力されているかを確認する方法は?
・「データフレームから抜き取り」とか「要約統計量」とか
・「次元の数」と「一番右下のセルに値が正しく入っているか」を確認
・欠測の数を数える
・EXCEL に出力して比較(コンペア)する
・R から折り返しはきだし,SAS 上で比較(コンペア)する
30
参考文献&謝辞
参考文献
THE R BOOK 4 章(岡田昌史 他;九天社)
データ解析環境 R 5 章(舟尾,高浪;工学社)
パッケージ「 RODBC 」「 foreign 」のヘルプ
発表資料作成の際にお世話になった人
北西 由武さん(塩野義製薬)
高浪 洋平さん(武田薬品工業)
終
で データハンドリング
~ データフレーム 30 分クッキング ~
で データハンドリング
~ ここからはおまけ ~
33
★ 作業ディレクトリの変更
ファイルからデータを読み込むには・・・
まず,データがあるディレクトリ(フォルダ)に作業ディレクトリ を変更する
次に,関数 read.table() などでファイルからデータを読み込む
ファイルからデータやプログラムを読み込んだり,
ファイルにデータを書き出したりする場所を 作業ディレクトリという
指定したディレクトリに指定した作業ディレクトリに データがセーブされたり, R 用エディタなどが保存 されるようになる
> setwd("c:/usr") # 作業ディレクトリを変更
> getwd() # 現在のディレクトリを確認 [1] "c:/usr"
34
★ 作業ディレクトリの変更 (Windows)
[ファイル] の [ディレクトリの変更]
を選択
[Browse] をクリックして,
変更先のディレクトリを選択
35
★ 作業ディレクトリの変更 (Mac OS X)
[その他] の 作業[ディレクトリの変更]
を選択
変更先のディレクトリを選択
36
★ テキストファイル ⇒ データフレーム
> x <‑ read.table("data01.txt")
V1 V2 V3 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
data01.txt
(1) 列名がなく,データ間がスペースで区切ら れている場合
⇒ R が勝手に列名を決めている
37
★ テキストファイル ⇒ データフレーム
> 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
(2) 列名があり,データ間がスペースで区切ら
れている場合
38
★ テキストファイル ⇒ データフレーム
> 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
(3) 1行目にコメント, 2 行目に列名があり,
データ間がスペースで区切られている場合
39
★ テキストファイル ⇒ データフレーム
> 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
(4) 列名があり,データ間がコンマで区切ら
れている場合
40
★ テキストファイル ⇔ EXCEL
目的は関数 read.csv() で読み込める形式に すること(前節の data04.txt の状態)
まず, EXCEL ファイルを開き,メニューの
[ ファイル ] の [ 開く ] から, [ 名前をつけて保存 ] を選択する
保存する名前をつけた後,次に [ ファイルの種類 ]
から [CSV カンマ区切り ] を選択して保存する
41
★ テキストファイル ⇔ EXCEL
Windows 版 R の場合
別名で保存
CSV(カンマ区切り)で保存
42
★ テキストファイル ⇔ EXCEL
Mac OS X 版 R の場合
別名で保存
CSV(カンマ区切り)で保存
43
★ テキストファイル ⇔ EXCEL
> x <‑ read.csv("data04.csv")
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.csv
(4’) 列名があり,データ間がコンマで区切ら
れている場合
44
★ テキストファイル ⇔ EXCEL
> 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
(5) 列名がなく,データ間がコンマで区切ら
れている場合
45
★ データフレームの作成
〔 EXCEL のセルをコピー&ペースト〕
Windows 版の場合は,列名をコピーしても
しなくてもよい
# 列名をコピーした場合
x <‑ read.delim("clipboard", header=
T
)# 列名をコピーしなかった場合
x <‑ read.delim("clipboard", header=
F
)46
★ データフレームの作成
〔 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: # ペーストする
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 1 222 DEF 2 333 GHI 1 444 JKL 2
;
proc copy in=work out=xxx ; select demo ; run;
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 sex 1 111 ABC Female 2 222 DEF Male 3 333 GHI Female 4 444 JKL Male
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 Y
1 1 Yes 2 2 No
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
の出力
+
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
の出力
+
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[["列名"]]
機能
コマンド
53
★ データへのアクセス方法(2)
データフレーム[行番号,列番号] で指定する
x[c(1,3,5),] # 1,3,5行目にアクセス sex height weight
1 F 158 51 3 M 177 72 5 M 166 64
x[,c(1,3)] # 1,3列目にアクセス sex weight
1 F 51 2 F 55 3 M 72 4 M 57
5 M 64 M 166 64
57 173
M
72 177
M
55 162
F
51 158
F
WEIGHT HEIGHT
SEX
データフレーム x
54
★ データへのアクセス方法(3)
データフレーム$列名 で指定する
> x$height # 身長データ
[1] 158 162 177 173 166
> x$height <‑ NULL # 身長を削除
> x
sex weight 1 F 51 2 F 55 3 M 72 4 M 57 5 M 64
64 166
M
57 173
M
72 177
M
55 162
F
51 158
F
WEIGHT HEIGHT
SEX
データフレーム x
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)
機能
コマンド
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)
機能
コマンド
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
Placebo Active Placebo Active
GROUP
D女史 B氏 Aさん Cくん Cくん D女史 Aさん B氏 B氏 D女史 Cくん Aさん
NAME
59.9 59.8
3
58.6 59.0
3
61.5 63.5
3
71.2 69.8
3
70.2 71.2
2
61.4 61.2
2
64.0 65.8
2
59.5 58.1
2
58.0 58.5
1
61.7 62.7
1
71.5 71.3
1
66.6 65.2
1
KG̲PM KG̲AM
DAY
+
B氏 D女史 Cくん Aさん
NAME2
Placebo Active Placebo Active
GROUP
+
x1 x2
x3
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.2 69.8
3 Placebo
58.6 59.0
3 Placebo
70.2 71.2
2 Placebo
59.5 58.1
2 Placebo
71.5 71.3
1 Placebo
58.0 58.5
1 Placebo
59.9 59.8
3 Active
61.5 63.5
3 Active
61.4 61.2
2 Active
64.0 65.8
2 Active
61.7 62.7
1 Active
66.6 65.2
1 Active
KG̲PM KG̲AM
DAY GROUP
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 51 2 <NA> 162 55 3 M NA 72
60
★ 欠損の扱い(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