8. 表データの操作

n  はじめに

データを読み込むと,そのデータは表のカタチになっています.ほとんどの計算は表の一部だけを取り出して使うことになります.

ふつうは,表の列(タテ1列)を取り出すか,表の行(ヨコ1列)を取り出して,それらを計算に使います.例えば,すべての被験者の年齢の平均や分散を調べたいならば,年齢についての列を取り出します.また,ある一人の被験者についての全データが欲しければ,その被験者の行を取り出します.


n  列と行の名前を確認する

データには,行(ヨコ1列)と列(タテ1列)のそれぞれに名前がついています.それを見るには,

> data = read.csv(demodata.csv)

> rownames(data)              # 行名(row=行)

> colnames(data)               # 列名(column=列)

とします.列名はデータ読み込みの際に,ヘッダー(表データの1番上の行のこと)で指定されますが,行名は読み込みの際にはオプションで指定しなければ,上から順に1, 2, 3,…と順番に数字が割り当てられます.

データを読み込む際に,行名も指定したければ,例えば,

>data1=read.csv(“demodata.csv”, row.names=1)

とします.row.names=1と指定することによって,demodata.csvファイルの1列目(id)が行名となります.

(注)IDは上から1,2,3,…なので,行名を指定しなかった場合と同じに見えるが,よく見るとIDの列が表から消えていることがわかる.


n  データから列(タテ1列)を取り出す

大きく3つの方法があります.データの入った変数をdataとすると,(1) data$htとする方法,(2) 変数ht2列目であることを使ってdata[ ,3] とする方法,(3) data[ ,”ht”] とする方法です(変数名htには” ”をつける必要があります).

> data = read.csv(“demodata.csv”)

> data$ht

> data[ ,3]

> data[ ,”ht”]

このデータを使って,年齢の平均と標準偏差を出すには,

> mean(data$ht)    # mean(data[ ,”ht”]) mean(data[ ,3])でも同じ

> sd (data$age)    # sd(data[ ,”ht”]) sd(data[ ,3])でも同じ

とします.

 

n  データから行(ヨコ1列)を取り出す

行を取り出すには,列の取り出し方のうち(1)に相当する方法はないので,2通りの方法しかありません.例えば,上から4行目の被験者のデータを取り出すには,(2’) 4行目であることを使ってdata[4, ] とする方法,(3’) 4行目の変数名”4” (4行目の変数名が”4”なのはたまたまです) を使ってdata[“4”, ] とする2つの方法があります.

> data[4, ]

> data[“4”, ]

 data[  ,列名]で列を指定し,data[行名, ]で行を指定する

データから一人の被験者の全データを取ってきて,計算をすることは通常しませんので(例えば,年齢と身長を足したり引いたりしても意味がない!),データから行を取り出す操作はあまり行いません.

 

n  複数の列(または行)を取り出す

例えば,性別sexと身長ht2列を取り出すには上述の(1) $を使った方法は使えず,(2’’) 変数sexと年齢ageがそれぞれ2列目と3列目であることを使ってdata[ , c(2, 3)] とする方法と,(3’’) 変数名を使ったdata[ ,c(“sex”,”ht”)] とする方法があります.

> data[ ,c(2, 3)]

> data[ ,c(“sex”,”ht”)]

複数の行を取り出すのも基本的に同じで,例えば,2番目と4番目の被験者のデータを取り出すには,(2’’’) 2列目と4列目であることを使ってdata[c(2, 4), ] とする方法と,(3’’’) 被験者名”2””4”を使ってdata[c(“2”, “4”), ] とする方法の2つがあります.(注)ここでは偶然,被験者名と行名が同じですが,例えば2番目と4番目の行名が”, “なら,data[c(“”, “”), ] となります.

> data[c(2, 4), ]

> data[c(“2”, “4”), ]

 

n  条件に合う行データのみ取り出す

いままでは,列名・行名を指定することで,特定の列や行を抜き取ってきました.しかし,例えば,「身長170cm以上の人」のデータを抜き出すような,条件に合うデータの抜き出しも,統計計算ではしょっちゅう行われます.どうすればできるのでしょうか?

説明を簡単にするために,minidata.csvデータを使います.これは10人分の性別と身長のデータです.

> data=read.csv("minidata.csv")

> data 

まず,条件を当てはめる列を特定することから始めます.身長の場合は,2列目の身長”data$ht”の列ですね.この身長データの中で170cm以上かどうかは,単に「身長>=170」とすれば良かったのですね.

> data$ht>=170

[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE FALSE

これよにって,表の上から679番目の人が身長170cm以上であることがわかりました.したがって,表の上から679番目の人の行データだけを抜き出すには,

> data[c(FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE), ]

  sex    ht

6   m 172.9

7   m 171.7

9   m 179.4

と,TRUE/FALSEの論理式を使って行を絞り込めば良いのです.行を選ぶ場合は,”データ[, ]”の◯側に指定する式を書くことに注意してください.

以上のようにTRUE/FALSEを自力で書くのは大変です.そもそも,この論理式は“data$ht>=170”という条件式で作ったものでした.そこで,”データ[,]”の◯側にこの条件式を入れれば,この条件を満たす行のみが選ばれることになります

> data[data$ht>=170, ]

  sex    ht

6   m 172.9

7   m 171.7

9   m 179.4

以上をまとめると,まず条件を当てはめる列を決め(今の場合は身長),条件式を作ります.そして,その条件に当てはまる行を抜き出すにはデータ[◯,△]”の◯側にその条件式を書けば良いのです.

データ[条件式,  ]で,条件にあう行だけ抜き出す

 

n  Excelのデータをいじらない!

Rではこのように,読み込んだデータを自由自在に編集(一部を取り出したり,並べ替えるなど)できますが,Excelでもデータの編集はできます.しかし,Excelでの編集は余計な列や行を挿入したり,すべての行(列)にわたってコピーするなど時間と手間がかかります.一方,Rでは同じ操作をほとんど一瞬で行なうことができます.また,Excelでデータ編集を行なうと元のデータが損なわれるという問題があります.したがって,Excelではデータの編集を行なわずにRで行なうようにしましょう.

Excelではデータを保存するだけ(編集しない)

 


課題1minidata.csvを使って以下の問いに答えてください.

(1)  身長150cm未満の行データのみ抜き出す式を書いてください.

(2)  身長150cm以上,170cm未満の行データのみ抜き出す式を書いてください.

(3)  身長150cm以上,170cm未満で,女性の行データのみ抜き出す式を書いてください.


課題2demodata.csvを使って,以下の問いに答えてください.

(1)  男性のデータを変数”mdata”, 女性のデータを変数”fdata”とするように式を書いてください.

(2)  男性の身長ht,体重wt,収縮期血圧sbp,拡張期血圧dbpのヒストグラムを描いてください.

(3)  女性の身長ht,体重wt,収縮期血圧sbp,拡張期血圧dbpのヒストグラムを描いてください.

(4)  男性の身長ht,体重wt,収縮期血圧sbp,拡張期血圧dbpの要約統計量(平均・標準偏差,メジアン・四分位範囲)を求めてください.

(5)  女性の身長ht,体重wt,収縮期血圧sbp,拡張期血圧dbpの要約統計量(平均・標準偏差,メジアン・四分位範囲)を求めてください. 

Ċ
西山毅,
2011/06/28 3:13
Ĉ
西山毅,
2011/06/28 3:13
Ĉ
西山毅,
2011/06/28 3:13
Comments