Comments
Description
Transcript
でデータハンドリング
で データハンドリング ~ データフレーム 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 で データハンドリング 終