で データハンドリング
2
本日のメニュー
データフレームとは ←
データフレームの作成
データハンドリングの方法と例
height De ns it y 0.00 0.05 0.10 0.15 0.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 0.05 0.10 0.15 0.20 0.25 Alto 2 Alto 1 Soprano 2 60 65 70 75 80 0.00 0.05 0.10 0.15 0.20 0.25 Soprano 13
データフレームとは
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) コンソール上 > x9
データフレームを作成すると・・・
> 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 ファイルを読み込む
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 DAY16
データハンドリング例(導入)
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 GROUP20
データハンドリング例(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 データフレーム X21
データハンドリング例(目的は・・・)
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 GROUP23
データハンドリング例(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」のヘルプ
発表資料作成の際にお世話になった人
北西 由武さん(塩野義製薬)
高浪 洋平さん(武田薬品工業)
終
で データハンドリング
で データハンドリング
~ ここからはおまけ ~
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 の場合
別名で保存
42
★ テキストファイル ⇔
EXCEL
Mac OS X 版 R の場合
別名で保存
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 ;
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 Male49
★
<寄り道>
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 データフレーム x55
★ データの加工・抽出(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 weight1 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