統数研シンポジウム r 061109jasp.ism.ac.jp/kinou2sg/contents/ism_symposium_r_2006.pdf0.20...
TRANSCRIPT
で データハンドリング~ データフレーム 30 分クッキング ~
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
3
データフレームとは
EXCEL:シート ACCESS:テーブル SAS:データセット
統計解析を行うデータの形式は様々
( R 上で)データを手で入力して・・・
テキストファイル,EXCEL,ACCESS,SAS などの形式
R でデータ解析を行う際は,データフレームという形式
にデータを変換することが多い(見た目は行列)
4
データフレームとは
数値ベクトルや文字ベクトル,
因子ベクトルなどの異なる型の
データをまとめてもつ変数
⇒ 外見は行列と同じ
⇒ 各列の要素の型はバラバラ
でも構わない
データフレームの各行・各列は
ラベルを必ず持ち,ラベルに
よる操作が可能
64166M
57173M
72177M
55162F
51158F
WEIGHTHEIGHTSEX
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
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
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()
データフレームの作成(手入力)
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)
64166M
57173M
72177M
55162F
51158F
WEIGHTHEIGHTSEX
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()などでテキストファイルからデータを
読み込むことが出来る
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 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 の中には,外部データを読み込む
ための関数が多数用意されている
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
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
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 に
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.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
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
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
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 未満の人
を抽出する
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
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
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
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
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
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
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 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 が勝手に列名を決めている
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) 列名があり,データ間がスペースで区切られている場合
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行目に列名があり,
データ間がスペースで区切られている場合
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) 列名があり,データ間がコンマで区切られている場合
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 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’) 列名があり,データ間がコンマで区切られている場合
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) 列名がなく,データ間がコンマで区切られている場合
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) <- argsreturn(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 1222 DEF 2333 GHI 1444 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 sex1 111 ABC Female2 222 DEF Male3 333 GHI Female4 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 Y1 1 Yes2 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 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
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
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
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
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
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
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
終
で データハンドリング