Rの基本

| Topic path: Top / バイオ・データ・マイニング / Rの基本

*目次 [#ud48f00c]
#contents

*はじめに [#gc93c04a]

『Rによるバイオインフォマティクスデータ解析』の第2章に従って,Rの基本をおさらいします.

#html{{
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=tohgoroh-22&o=9&p=8&l=as1&asins=4320057082&ref=tf_til&fc1=444B4C&IS2=1&lt1=_blank&m=amazon&lc1=444B4C&bc1=FFFFFF&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
}}


*対話モードでのR操作 [#scb00e46]

Rは対話モードで操作を行います.
コンソール画面(R Console)に
#geshi(rsplus){{
>
}}
と表示されているときは,Rがコマンド入力を受け付けていることを表します.
この「>」を''コマンド・プロンプト''と呼びます.

コマンド・プロンプトに「1+1」と入力してReturnキーを押します.
すると,次のように計算結果が表示されます.
#geshi(rsplus){{
> 1+1
[1] 2
>
}}

コマンドの途中でRetrunキーを押すと,改行されます.
このとき,コマンド入力が継続していることを表す「+」の記号が行頭に表示されます.

たとえば,「1-」と入力してReturnキーを押すと,次のように表示されます.
#geshi(rsplus){{
> 1-
+
}}
これは,式がまだ完了していないので,コマンド入力を引き続き受け付けていることを表しています.
続けて「1」と入力してReturnキーを押すと,次のように表示されます.
#geshi(rsplus){{
> 1-
+ 1
[1] 0
>
}}
今度は,式が完了しているので計算が行われ,計算結果の0が表示されました.

Rには''ヒストリー機能''があって,今までに実行したコマンドを覚えています.
↑(上矢印)キーを押すと,一つ前に実行したコマンドが表示されます.
さらに↑キーを押すと,もう一つ前に実行したコマンドが表示されます.
↓(下矢印)キーを押すと,一つ後に実行したコマンドが表示されます.


*Rの基本データ構造 [#df13532c]

**ベクトル [#k5b36af7]

Rのデータは''ベクトル''として扱われます.
たとえば,「0」と入力すると,
#geshi(rsplus){{
> 0
[1] 0
>
}}
と表示されます.
この「[1]」は,0がベクトルの第1次元の値であることを表しています.

「:」(コロン)を用いると,公差1の等差数列ベクトルを表すことができます.
たとえば,「51:100」は,初項51,公差1の100以下の項の等差数列ベクトルを表します.
#geshi(rsplus){{
> 51:100
 [1]  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66
[17]  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82
[33]  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98
[49]  99 100
> 
}}
ここで,「[1]」や「[17]」は,それぞれの行の最初のデータの次元番号を表しています.
すなわち,51は第1次元,67は第17次元,83は第33次元,99は第49次元であることを示しています.
改行される位置は,ウィンドウの幅によって変わります.

ベクトルを作成する関数として,組み込み関数cが用意されています.
たとえば,「c(10, 20, 30)」は,10, 20, 30という要素から成るベクトルを作成します.
#geshi(rsplus){{
> c(10, 20, 30)
[1] 10 20 30
>
}}


**文字列 [#e2eef076]

また,標準で用意されているベクトル・データに,LETTERS(とletters)があります.
「LETTERS」と入力するとアルファベットの大文字が各次元に一文字ずつある26次元のベクトルが表示されます.
#geshi(rsplus){{
> LETTERS
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P"
[17] "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
>
}}

ここで,「"A"」はダブル・クオーテーション(")で囲まれています.
これは,これがAという''文字列''であることを表しています.

人間にとっては1も"1"も同じように思われますが,コンピューターにとっては値の1と文字列の"1"は全然違うものです.
ですから,Rでは,「1+1」の計算はできますが,「"1"+"1"」の計算はできません.
#geshi(rsplus){{
> 1+1
[1] 2
> "1"+"1"
 以下にエラー "1" + "1" :  二項演算子の引数が数値ではありません 
> 
}}


* 変数とオブジェクト [#p98d6756]

**オブジェクト [#od6a5e4e]
複雑な計算をするときは,計算をいくつかの部分に分けて行い,その結果に対して計算を行うということがあります.
このようなとき,いくつかの部分に分けられた計算の結果を覚えておく必要があります.

このような計算の途中結果,あるいは値や文字列などのデータを覚えておくため入れ物を''変数''または''オブジェクト''と呼びます.


**代入 [#rcc946e0]
計算の途中結果,値,データなどをオブジェクトに覚えさせることを,''代入''と呼びます.
オブジェクトに代入するときは,不等号記号とマイナスの記号で「<-」という矢印を作ってこれを使います.
これは,右辺の式を計算し,その結果を左辺のオブジェクトに代入します.
#geshi(rsplus){{
> a <- 1
> b <- 2
> c <- a+b
> c
[1] 3
>
}}

向きが反対の「->」も使えます.
こちらは,左辺の計算結果を右辺のオブジェクトに代入します.

代入する際に式全体を「()」で括ると,計算結果を表示します.
#geshi(rsplus){{
> c <- a+b
> (c <- a+b)
[1] 3
> 
}}



**表示と削除 [#ne1b3291]

オブジェクトのリストを表示するときは,lsコマンドかobjectsコマンドを使います.
#geshi(rsplus){{
> ls()
[1] "a" "b" "c"
> objects()
[1] "a" "b" "c"
}}
lsというのは,listの省略形です.

たくさんのデータを格納したオブジェクトはコンピュータのメモリーをたくさん使用しますので,不要になったオブジェクトはrmコマンドを用いて削除します.
#geshi(rsplus){{
> rm(a)
> ls()
[1] "b" "c"
> rm(b)
> ls()
[1] "c"
> a
 エラー:  オブジェクト 'a' がありません 
>
}}
rmというのは,removeの省略形です.


*特殊な値 [#z25862d4]

コンピューターでは,''数値''や''文字列''以外の特殊な値も扱われています.

**論理値 [#jdd3d2f6]

論理値には,真を表す''TRUE''と偽を表す''FALSE''があります.
条件判定を行ったときの結果を表したりするのに用いられます.

**欠損値 [#pa4b9191]

欠損値はデータがない状態を表し,''NA''と表示されます.
たとえば,要素数1のベクトルの2次元目の値を表示すると,次のようになります.
#geshi(rsplus){{
> (a <- 1)
[1] 1
> a[1]
[1] 1
> a[2]
[1] NA
>
}}

**無限と非数 [#nee79bf0]

無限大の数は''Inf''と表されます.
Rでは,正の数を0で割ると,その結果はInfとなります.(他のプログラミング言語では0での割り算ができないものもあります.)
#geshi(rsplus){{
> 1 / 0
[1] Inf
> -1 / 0
[1] -Inf
>
}}

また,非数(数として不適切な値)は''NaN''と表されます.
Rでは,0を0で割ると,その結果はNaNとなります.
#geshi(rsplus){{
> 0 / 0
[1] NaN
>
}}

**空値 [#i4271e66]

空の値は''NULL''と表されます.
#geshi(rsplus){{
> (a <- NULL)
[1] NULL
}}

NULLは,オブジェクトは存在しているけれども,その中身が空であることを表しています.


*演算子 [#ce861558]

コンピューターで計算することを''演算''といい,演算の命令に使う記号を''演算子''といいます.

演算には,加算や減算などの''算術演算'',等号や不等号などの''比較演算'',論理和や論理積などの''論理演算'など'があります.


**算術演算子 [#wa65ea62]
|~演算子|~処理|~使用例|~使用例の計算結果|h
|+|加算(たし算)|1 + 2|3|
|-|減算(ひき算)|3 - 2|1|
|*|乗算(かけ算)|2 * 2|4|
|/|除算(わり算)|5 / 2|2.5|
|^|ベキ乗|2 ^ 3|8|
|-|マイナス|- 3|-3|
|%/%|除算の整数部(わり算の整数部)|5 %/% 2|2|
|%%|剰余(わり算の余り)|5 %% 2|1|
|%*%|行列の内積|||
|%o%|行列の外積|||

行列の内積と外積については,後で使用例を示します.

**比較演算子 [#h6f5444a]
比較演算子の結果は論理値,つまりTRUEかFALSEになります.
|~演算子|~処理|~使用例|~使用例の計算結果|h
|==|等号(等しい)|3-2 == 1|TRUE|
|!=|不等号(等しくない)|3-2 != 1|FALSE|
|<|より小さい|3-2 < 1|FALSE|
|<=|以下(等しいかより小さい)|3-2 <= 1|TRUE|
|&gt;|より大きい|3-2 > 1|FALSE|
|>=|以上(等しいかより大きい)|3-2 >= 1|TRUE|


**論理演算子 [#ia2eca22]
論理演算子は,論理値(または論理ベクトル)に対して計算を行い,結果も論理値(または論理ベクトル)になります.
|~演算子|~処理|~使用例|~使用例の計算結果|h
|!|否定|!TRUE|FALSE|
|&&|先頭要素の論理積|TRUE && FALSE|FALSE|
|&|対応する要素の論理積|c(TRUE, TRUE) & c(TRUE, FALSE)|TRUE FALSE|
|&#x7c;&#x7c;|先頭要素の論理和|TRUE &#x7c;&#x7c; FALSE|TRUE|
|&#x7c;|対応する要素の論理和|c(TRUE, TRUE) &#x7c; c(TRUE, FALSE)|TRUE TRUE|


**そのほかの演算子 [#s8b6ad8f]
|~演算子|~処理|~使用例|~使用例の計算結果|h
|:|公差1の等差数列ベクトル|1:5|1 2 3 4 5|
|$|リストの要素|||
|[[]]|リストの要素|||
|[]|ベクトルの要素|(1:5)[3]|3|

リストの要素については,後で説明します.



*データ型 [#p423e788]
**ベクトル [#tcbe3716]
ベクトルの要素を表すには[]を付けて中にインデックス番号を指定します.
#geshi(rsplus){{
> a <- c(5, 6, 7, 8)
> a[1]
[1] 5
}}

インデックス番号の前に-を付けると,その要素を除いたベクトルを返します.
#geshi(rsplus){{
> a[-1]
[1] 6 7 8
}}

要素に名前を付けることもできます.
#geshi(rsplus){{
> a <- c(x = 10, y = 20)
> a
 x  y
10 20
}}

関数names()は名前のベクトルを返します.
#geshi(rsplus){{
> names(a)
[1] "x" "y"
}}

名前付きの要素を持つベクトルの要素を名前あるいはインデックス番号で指定するのに[[]]を使います.
#geshi(rsplus){{
> a[1]
 x 
10 
> a[1][["x"]]
[1] 10
> a[1][[1]]
[1] 10
}}


**ファクター [#r3ed4008]
ファクターは離散値の要素を持つベクトルです.
カテゴリー変数やラベルなどに用いられます.
#geshi(rsplus){{
> a <- factor(c("yes", "no", "yes", "no", "no"))
> a[1]
[1] yes
Levels: no yes
}}


**行列 [#b3691ca5]
行列は2次元のベクトルです.
#geshi(rsplus){{
> a <- matrix(1:6, nrow=2, ncol=3)
> a
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
}}

行だけ,列だけをベクトルとして取り出すことができます.
#geshi(rsplus){{
> a[1,]
[1] 1 3 5
> a[,1]
[1] 1 2
}}

行列の内積を%*%演算子で,外積を%o%演算子で求めることができます.
#geshi(rsplus){{
> a <- matrix(1:4, nrow=2, ncol=2)
> a
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> b <- matrix(c(1,0,0,-1), nrow=2, ncol=2)
> b
     [,1] [,2]
[1,]    1    0
[2,]    0   -1
> a %*% b
     [,1] [,2]
[1,]    1   -3
[2,]    2   -4
> 1:9 %o% 1:9
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]    1    2    3    4    5    6    7    8    9
 [2,]    2    4    6    8   10   12   14   16   18
 [3,]    3    6    9   12   15   18   21   24   27
 [4,]    4    8   12   16   20   24   28   32   36
 [5,]    5   10   15   20   25   30   35   40   45
 [6,]    6   12   18   24   30   36   42   48   54
 [7,]    7   14   21   28   35   42   49   56   63
 [8,]    8   16   24   32   40   48   56   64   72
 [9,]    9   18   27   36   45   54   63   72   81
}}


**配列 [#l41d6f8f]
配列は3次元以上のベクトルです.
#geshi(rsplus){{
> array(1:3, c(2,3,4))
, , 1

     [,1] [,2] [,3]
[1,]    1    3    2
[2,]    2    1    3

, , 2

     [,1] [,2] [,3]
[1,]    1    3    2
[2,]    2    1    3

, , 3

     [,1] [,2] [,3]
[1,]    1    3    2
[2,]    2    1    3

, , 4

     [,1] [,2] [,3]
[1,]    1    3    2
[2,]    2    1    3

}}

**リスト [#qde4506a]
リストは,複数のベクトル,ファクター,行列,配列などに名前を付けて一つにまとめたものである.
リストは,複数のベクトル,ファクター,行列,配列などに名前を付けて一つにまとめたものです.
#geshi(rsplus){{
> labels <- factor(c("no", "yes"))
> l <- list(x = c(0, 1), y = labels[1])
> l
$x
[1] 0 1

$y
[1] no
Levels: no yes

}}

$でリストの要素を表します.
#geshi(rsplus){{
> l$x
[1] 0 1
> l$y
[1] "no"
}}


**データフレーム [#j42670a1]
データフレームはRにおけるデータを表す特殊なリストで,関数data.frame()を用いて作成します.
#geshi(rsplus){{
> data <- data.frame(
+   x1 = c(0, 1, 2),
+   x2 = c(3, 4, 5),
+   y  = c("yes", "no", "no")
+ )
> data
  x1 x2   y
1  0  3 yes
2  1  4  no
3  2  5  no
> data$x1
[1] 0 1 2
> data$x2
[1] 3 4 5
> data$y
[1] yes no  no 
Levels: no yes
}}

関数attach()を用いると,データフレームのカラムに直接アクセスできるようになります.
#geshi(rsplus){{
> attach(data)
The following object(s) are masked _by_ '.GlobalEnv':

    x1, x2, y
> x1
[1] 0 1 2
> x2
[1] 3 4 5
> y
[1] "yes" "no"  "no" 
}}

ただし,データフレームの内容を書き換えるにはデータフレームそのものにアクセスする必要があります.
#geshi(rsplus){{
> x1[1]
[1] 0
> x1[1] <- 9
> x1
[1] 9 1 2
> data$x1
[1] 0 1 2
> data$x1[1] <- 9
> data$x1
[1] 9 1 2
> x1
[1] 9 1 2
}}

データフレームのカラムへの直接アクセスを解除するには,関数detach()を用います.
#geshi(rsplus){{
> detach(data)
> x1
 エラー:  オブジェクト 'x1' がありません 
}}



*参考文献 [#d97c43cd]
#html{{
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=tohgoroh-22&o=9&p=8&l=as1&asins=4320057082&ref=tf_til&fc1=444B4C&IS2=1&lt1=_blank&m=amazon&lc1=444B4C&bc1=FFFFFF&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
}}
-2章 Rの基本
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS