ベクトルの生成
Rではデータを「ベクトル」として扱います.ベクトルというと例の矢印を思い浮かべるかもしれませんが,ここではもっと一般的な形のベクトルを指しています.複数の数字などを並べたモノだと思ってもらえれば結構です.実数や複素数といった数値のほか,文字列,TRUE・FALSEで表される論理値などもベクトルとして取り扱われます.
ともあれ,ベクトルを作ってみましょう.ベクトルはc()という関数で生成されます.
> c(1,2,3)
[1] 1 2 3
(ここで行頭の「>」は入力する必要はありません.コンソールの左端に最初から出ているヤツです.「>」が付いているのは入力,付いていないのは出力と解釈してください.)
このように,ベクトルにしたい個々の要素を半角カンマ「,」で区切って並べるとベクトルができます.
ここで[1]というのはその列の最初の数字がベクトルの1つ目の要素であることを示しています.今は大して有り難味がありませんが,ベクトルがもっと長くなって全ての要素の表示に改行が必要になったとき役に立つことがあるでしょう.
また,公差1の等差数列(例えば,[1, 2, 3, 4, 5, ...])を要素に持つベクトルは関数[:]で簡単に作成できます.この関数は少々使い方が特殊ですが,例を見ればすぐに理解できるでしょう.
>1:10
[1] 1 2 3 4 5 6 7 8 9 10
>10:1
[1] 10 9 8 7 6 5 4 3 2 1
1から1つずつ値を増やすベクトルというのはデータに番号を振ったり繰り返し処理のときの回数を数えたりと使い道が多いので覚えておいてください.
文字列や論理型のベクトルの作り方も同様です.文字列のベクトルを作るときは半角ダブルクオーテーション「"」で括るのを忘れないでください.括らなかった場合,次に説明する「変数」であると解釈されてしまいます.
> c("cat", "dog", "人間")
[1] "cat" "dog" "人間"
> c(T, F, TRUE, FALSE)
[1] TRUE FALSE TRUE FALSE
また、ベクトルのそれぞれの要素に名前をつけることもできます。名前をつけるには、ベクトルの要素を引数として与える際に「名前=ベクトルの要素」とします。
> c(犬=3, 猫=4, カモ=100)
犬 猫 カモ
3 4 100
Rではベクトルのほかにもっと複雑なデータの並び方をした
配列?や
データフレーム?などもありますが,基本はベクトルです.データフレームなどもバラせばベクトルになります.これらは必要になったときに改めて解説します.
オブジェクトと代入、要素へのアクセス
ベクトルの作り方はわかりました.しかしベクトルを作ってみても現時点ではコンソールに表示して終了です.これでは面白くありません.せっかく作ったベクトルをどこかへ一時的に保管しておきたいところです.
そこで使われるのが「オブジェクト」です.Rではデータや関数を含め、全てが「オブジェクト」として扱われます。オブジェクトには小さなものから大きなものまで、数値から文字列、論理値まで、割と何でもしまうことが可能です.オブジェクトへの収納の仕方はこうです.
x <- 1:10
ここでオブジェクトは「x」で,半角の記号2つで作った矢印「<-」によって「xのなかに『1:10』という関数によって作られるベクトルを入れておいてくれ」という命令をしているわけです.この操作を「代入」と言います.Rでは,代入操作によってオブジェクトが作られます.何も言わずにいきなり代入をしてしまって大丈夫です.あらかじめ「xという箱を用意しておいてくれ」とか命令する必要はありません.矢印の方向を逆にして,
1:10 -> x
などとしても大丈夫です.
オブジェクト名はかなり自由に設定できますが、いくつかのルールがあります。
- 文字ではじめなければならない(数字や記号は×。しかし「.」は○。)
- ピリオド「.」で始まるオブジェクトは隠しオブジェクト扱いとなる(使用しているオブジェクトの一覧はls()とコマンドすることで表示できますが、隠しオブジェクトは表示されません)
- 最初が文字ならば間に記号や数字を挟むのは問題ない
- 大文字と小文字は区別される
- TRUE、FALSE、T、F、pi、cなどといった最初から用意されている特殊な文字、変数、関数へは代入しないほうがいい(代入は可能なので注意する)
オブジェクトはその名前を打ち込むことで呼び出すことができます.
> x <- 1:10
> x
[1] 1 2 3 4 5 6 7 8 9 10
また、「オブジェクト名[添字]」とすることで、ベクトルの特定の要素へアクセスすることができます。添字(そえじ)にたとえば数値を指定して「オブジェクト名[2]」としたならば、ベクトルの中の2番目の要素へアクセスする(呼び出す)ことを意味します。
> x[2]
[1] 2
添字の部分に指定できるのは数値だけではありません。
- 複数の添字をベクトルとしてまとめて指定することで、複数の要素をまとめて呼び出せる。
- マイナス記号をつけて指定すると、指定した要素以外の要素を全て指定できる。
- 論理値による指定が可能である(つまり、「x<5」という式を満たす要素のみの取り出しなどが可能である)。
- ベクトルの要素に名前がついている場合、名前による指定も可能である。
テキストだけでは分かりづらいと思いますから例を見てみましょう。
> x <- 1:10 #ベクトルの作成
> x
[1] 1 2 3 4 5 6 7 8 9 10
> x[c(1,3,5)] #複数の要素の指定
[1] 1 3 5
> x[-5] #一部を除く要素の指定
[1] 1 2 3 4 6 7 8 9 10
> x[x < 5] #条件を満たす要素の指定
[1] 1 2 3 4
> c(犬=3, 猫=4, カモ=100) #名前付きベクトルの作成
犬 猫 カモ
3 4 100
> x["犬"] #名前による指定ではダブルクオーテーション""による囲みが必要
犬
3
ベクトルを用いた計算
ベクトルに対して各種の演算を施すことができます.基本的には要素同士の計算になります.
> x <- 1:10
> y <- 11:20
> x
[1] 1 2 3 4 5 6 7 8 9 10
> y
[1] 11 12 13 14 15 16 17 18 19 20
> x+y
[1] 12 14 16 18 20 22 24 26 28 30
通常の行列計算と異なり,掛け算,割り算も要素同士の計算になります(通常の行列における積は%*%という記号で計算します).また,長さが異なっていても計算は可能です.その場合,要素の少ないベクトルが循環して使用されます.要素の多いベクトルの長さ(要素数)が要素の少ないベクトルの長さの整数倍でない場合はエラーが出ますが,一応計算結果は返ってきます.
> x <- rep(1,10)
> y <- 1:3
> x
[1] 1 1 1 1 1 1 1 1 1 1
> y
[1] 1 2 3
> x*y
x * y 中で警告がありました:
長いオブジェクトの長さが短いオブジェクトの長さの倍数になっていません
[1] 1 2 3 1 2 3 1 2 3 1
ここで使ったrep()関数は引数を2つ使う関数で,1つ目の引数を2つ目の引数の回数だけ繰り返したベクトルを生成します.上の例では1を10個持ったベクトルを作ったわけです.
t検定
ではこれまでの知識を使ってRで2標本のt検定をやってみましょう.
まずはデータベクトルをオブジェクトに代入します
> data1 <- c(1.12, 1.33, 0.75, 0.98, 1.24)
> data2 <- c(3.01, 3.58, 2.19, 2.01, 2.11)
2標本なので2つ必要です.
次に,t検定を行う関数へこれらのデータを渡します.t検定はt.test()関数によって実行します.
> t.test(data1, data2)
するとただちに結果がコンソールに返ってきます.
Welch Two Sample t-test
data: data1 and data2
t = -4.6263, df = 4.875, p-value = 0.006073
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-2.3336782 -0.6583218
sample estimates:
mean of x mean of y
1.084 2.580
ここにはいろいろな情報が含まれていますが,まずはp-valueの部分を確認しましょう.ここの値は帰無仮説が正しかった場合にこのようなデータが採取される確率です.たとえば最初に棄却域を5%と定めているのであれば,この値が0.05よりも小さいときに私たちは「2つのデータの平均値には有意な差がある」などと言うわけです.
他には,95 percent confidence intervalなるものが書いてあります.これはdata1の平均値とdata2の平均値の差が95%の確率で含まれる範囲です.この領域に0が含まれないということは,5%の危険率で有意な差があると主張するのと同じことになります.
最後には「xとyの平均値」なるものが書いてありますが,これはdata1とdata2の平均値になります.
なお,Welch Two Sample t-testと書いてあるように,RではWelchのt検定がデフォルトになっています.これはサンプルの等分散性を仮定しないt検定です.
最終更新:2008年08月10日 00:52