初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1]...

21
初心者用 R 言語講座 2 2013 3 12 文責:斎藤輪太郎・鈴木治夫

Transcript of 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1]...

Page 1: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

初心者用

R言語講座

第 2版 2013年 3月 12日

文責斎藤輪太郎鈴木治夫

2

0 はじめに

R言語は統計処理を得意とする言語です多量のデータを科学技術計算を駆使して処理し

そこに含まれる傾向を解析したり可視化したりといったことが比較的簡単にできます

本テキストでは手っ取り早く Rの簡単な使い方を勉強します

1 Rの起動と終了

システムによって異なりますが通常はコマンドラインで R と入力するかR のアイコ

ンをダブルクリックして起動しますRを終了させるときは

q()

と入力します

2 簡単な変数への代入

変数とは様々な値を格納する箱のような概念です例えば今 x という変数を考えそこ

に 123を代入したければ

x lt- 123

としますその後に xと打ち込むと下記のように xの値が表示されます

gt x lt- 123

gt x

[1] 123

gt

実は Rは単一の数値だけでなく複数の数値をベクトルとして扱うことが得意です1例

えばベクトル(1 3 5)を変数 yに代入したければcという記号を先頭に付けて

y lt- c(1 3 5)

とします2から 5までの整数を含むベクトルを作成するにはy lt- c(2345)でもいいの

ですが

y lt- 25

と簡略化して書くことが可能です

課課題題 22--11 変数 zにベクトル(10 11 12)を代入しまたそれを表示してみましょう

1 単一の数値(スカラー)は実は一次元ベクトルとみなされると考えればよい

3

3 簡単な演算

R上では四則演算を含む様々な演算を行うことが可能です例えば 1+2 と入力すれば

以下のように 3という答えが返ってきます

gt 1 + 2

[1] 3

gt

+は加算-は減算は乗算は除算または^はべき乗を表します

ベクトルの演算も可能でc(1 2 3) + c(4 5 6)とすればベクトル(5 7 9)が返ってきま

すc(1 2 3) 2ならベクトル(2 4 6)が返ってくるはずです変数を含めた演算も可能

でxに c(1 2 3)yに(4 5 6)を代入しておくとx + yはベクトル(5 7 9)になります

演算を使って変数の値を変更することも可能ですx lt- c(1 2 3)の後

x lt- x 2

は xのベクトルの値を 2倍にしその結果が xに格納されます

課課題題 33--11 変数 xにベクトル(1 2 3)変数 yに 2を代入しx yを計算してみましょう

どんな答えが返ってきますか

課課題題 33--22 変数 xにベクトル(1 2 3)を代入しさらにそれを 3倍にした結果を xに格納し

ましょう

4 簡単なベクトル演算

既に説明したようにcの直後に括弧の中に入った数字を並べることでベクトルを表現す

ることができますベクトルの次元数すなわちベクトル中の数値の個数は

length(x)

で求めることができますその中から一部を取り出すことも可能です例えばx lt-

c(246810)とした後

x[3]

とすると3番目の数値 6を抽出することが可能です

x[c(24)]

で2番目と 4番目の数値を抽出できまた

x[24]

とすれば2番目から 4番目までの数値を抽出することが可能です

ベクトルの比較演算も可能で例えばベクトルの各要素が 5 より大きいかどうかを判定

するためにはx gt 5としますすると各要素が 5より大きいか大きくないかを判定した

結果が TRUE FALSEのベクトル(略して T F)として返ってきます

4

gt x lt- c(246810)

gt x

[1] 2 4 6 8 10

gt x gt 5

[1] FALSE FALSE TRUE TRUE TRUE

gt

whichを使うと何番目が Tなのかが返ってきます返ってきた T Fのベクトルを使っ

てさらに which(c(F F T T T))とするとベクトル(345)が返ってきますが一気に which(x

gt 5)としても同じ答えになります

gt x lt- c(246810)

gt which(x gt 5)

[1] 3 4 5

gt

この T Fのベクトルを使ってTの部分だけを抽出することが可能です

x[ c(F F T T T)]

以上をまとめてx gt 5の要素だけを抽出するには

x[ x gt 5 ]

とすることができます

実は数値だけでなく文字列もベクトルのように扱うことができて

x lt- c(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

とした後x[2]とすれば 2 番目の文字列rdquoMondayrdquoが取り出されます文字列のベクトルに

対しても様々な操作が可能で例えば

grep(ldquosdrdquo x)

は x の中でrdquosdrdquoという部分文字列が含まれているのは何番目の要素かをベクトルで返しま

す従って以下のようにするとrdquosdrdquoが含まれている文字列を抽出することができます

gt x lt- c(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

gt x[ grep(sd x) ]

[1] Tuesday Wednesday Thursday

gt

ベクトルの各要素には namesを使って名前を付けることができます例えば

x lt- c(2 4 6)

names(x) lt- c(First Second Third)

5

とするとxの namesという属性に(ldquoFirstrdquo ldquoSecondrdquo ldquoThirdrdquo)が付けられ

x[[ ldquoSecondrdquo ]]

で 2番目の値が抽出されます

さらに数値データのみで構成されるベクトルに対しては様々な統計関数が定義されてい

ます例えば

sum(x)

でベクトル xの合計

mean(x)

でxの平均が求められますさらにTまたはFから構成されるベクトルxについては sum(x)

で Tの数を数えるので

x lt- c(246810)

sum(x gt 5)

でベクトル xの要素の中で 5を超えるものがいくつあるかすなわち 3を返します

課課題題 44--11 ベクトル(3 1 4 1 5 9 2 6 5)の中で 5より大きい要素からなるベクトルを作成

しましょう

課課題題 44--22 ベクトル(123456789101112)に(ldquoJanrdquo ldquoFebrdquo ldquoMarrdquo ldquoAprrdquo ldquoMayrdquo ldquoJunrdquo

ldquoJulrdquo ldquoAugrdquo ldquoSeprdquo ldquoOctrdquo ldquoNovrdquo ldquoDecrdquo)という名前を付けrdquoMarrdquoという文字列を使って 3

番目の要素を取り出してみましょう

5 簡単な行列の作成と演算

ベクトルを集めるとrbind を使って行列を作成することが可能です例えば 1 行目が

(123)2行目が(456)の行列 x =

1 2 3

4 5 6

を作るには

x lt- rbind(c(123) c(456))

としますその後に xと入力すると作成した行列が表示されるのが分かります

gt x lt- rbind(c(123) c(456))

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt

これは

x lt- matrix(c(1 4 2 5 3 6) nrow=2 ncol=3)

6

または

x lt- matrix(c(1 2 3 4 5 6) nrow=2 ncol=3 byrow=T)

としても作成可能です上記は(1 2 3 4 5 6)を使って 2行 3列の行列を作成する(nrow=2

ncol=3)その際行から埋めてゆく(byrow=T)ということを表しています

作成した行列 x に対しては様々な演算が可能ですnrow(x) ncol(x)はそれぞれ x の行数

と列数を表しますx + 1は行列の各要素に 1を足した答えを返しx 2は各要素を 2倍

にした答えを返します行列同士の演算も可能でy lt- rbind(c(2 4 6) c(8 10 12))とした

後x + yとすると行列 xと yの対応する各要素同士を足し合わせた行列が返ってきます

x yなら各要素同士を掛け合わせた行列が返ってきます2

行列からは任意の行や列を簡単に取り出すことができます例えば2行目を取り出し

たい場合

gt x[2]

[1] 4 5 6

gt

としますまた2列目を取り出したい場合は

gt x[2]

[1] 2 5

とします

t(x)とすると行列 xが転置されます(行と列が入れ替わる)

gt t(x)

[1] [2]

[1] 1 4

[2] 2 5

[3] 3 6

gt

行列 xの各行の平均は以下のように求めることができます3

gt apply(x 1 mean)

[1] 2 5

行列 xの各列の平均は以下のように求めることができます

gt apply(x 2 mean)

2 行列の積はで計算する 3 applyの中の1は一次元目の各項番の平均すなわち各行の平均を計算することを意味す

る同様にして2は二次元目の各項番の平均すなわち各列の値の平均を計算すること

を意味する

7

[1] 25 35 45

行列は 2次元の数値の羅列ですがRでは array(ベクトル各次元の要素の個数)を使っ

てさらに n次元に拡張された配列を扱うことができます

x lt- array(124 c(342))

は 3times4times2 の大きさの3次元配列を作成し一番目の次元目の値から順番に埋めてゆきま

gt x lt- array(124 c(342))

gt x

1 3次元目の1番目の 3times4配列

[1] [2] [3] [4]

[1] 1 4 7 10

[2] 2 5 8 11

[3] 3 6 9 12

2 3次元目の 2番目の 3times4配列

[1] [2] [3] [4]

[1] 13 16 19 22

[2] 14 17 20 23

[3] 15 18 21 24

gt

課課題題 55--11

1 3 5

7 9 11

1 2 3

2 4 6

を計算しましょう

課課題題 55--22 上記結果に対して行列それぞれの平均を求めましょう

6 簡単なリストの作成

リストは様々な型のデータをひとまとめにして管理できるデータ型です

x lt- list(Oh Nomura Kadota)

はrdquoOhrdquordquoNomurardquordquoKadotardquoを要素とするリストを作成しますこれらは全て文字列です

がベクトルを織り交ぜることもできます

x lt- list(Oh Nomura Kadota c(868 657 567))

8

で最後にベクトル(1 2 3)が加わっていますここから2番目の要素を取り出すためには

x[[2]]

とします各々の要素に名前を付けることも可能です

x lt- list(First=Oh Second=Nomura Third=Kadota Home_Runs=c(868 657 567))

として各々の要素に First Second Third Home_Runsという名前が付いていることを確

認しましょう

gt x

$First

[1] Oh

$Second

[1] Nomura

$Third

[1] Kadota

$Home_Runs

[1] 868 657 567

gt

名前を使って個々の要素を取り出すためには(例えば2つ目の要素を取り出すには)

x[[Second]]

または

x$Second

とします

課課題題 66--11 名前が Yamagata のベクトル(ldquoTsuruokardquo ldquoSakatardquo ldquoYonezawardquo)と名前が

Niigataのベクトル(ldquoYuzawardquo ldquoNiitsurdquo ldquoShibatardquo)を要素にしたようなリストを作成しそ

の中味を表示してみましょう

9

7 簡単なデータフレームの作成

Rにはデータフレームと呼ばれる型が存在しますこれもリストの一種で行列と同じ二

次元配列ですデータフレームの各々の行は1つのサンプルに対する観測値各列はサン

プルに対する1つの項目とみなすことができますこれを使うと表を簡単に表現するこ

とができます以下の表は日本プロ野球の5人の元選手の名前在籍チーム名通算打数

安打数本塁打数を表したものです

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

これをデータフレームを使って表すと以下のようになります

x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

データフレームを作り出す関数 dataframeは dataframe(rownames = 列のラベルのベク

トル列名 1 = ベクトル 1列名 2 = ベクトル 2 )の形式で使うことができますxの中

味は以下のようになっていることが分かります

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

通常のリストと同様列名を使って対応するベクトルを抽出することができます

gt x$Hits

[1] 2901 3085 2543 2786 2566

gt

10

データフレームからは任意の部分をさらにデータフレームとして抽出することができ

ます例えば 15行目と 234列目を抽出する場合

x[ c(15) c(234) ]

とします4

データフレームに対してさらに様々な処理が可能ですまずは上記で定義された x にど

のような属性があるのかattributesで調べてみましょう

gt attributes(x)

$names

[1] Team At_Bat Hits Home_Runs

$rownames

[1] Nomura Harimoto Kinugasa Oh Kadota

$class

[1] dataframe

gt

属性としてnames rownames class が出てきましたnames(x)rownames(x)class(x)

と入力してみましょうそれぞれ列名行名xの型が出てくるでしょう

課課題題 77--11 下の表は G8 加盟国の国力の一部ですこれをデータフレームとして変数にしま

しょう5

Area Population GDP

USA 94 315 14

England 02 62 3

Italy 03 60 2

Canada 100 34 2

Germany 03 82 4

Japan 03 127 5

France 05 62 3

Russia 171 141 2

4 x[c(Nomura Kadota)c(At_Bat Hits Home_Runs)]でも同様に

動作する 5 要素が全て数値なので行列として扱うこともできるデータフレームにしてしまった

変数 xに対しては行列演算ができないことがあるのでその場合は asmatrix(x)で行列に

変換する

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 2: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

2

0 はじめに

R言語は統計処理を得意とする言語です多量のデータを科学技術計算を駆使して処理し

そこに含まれる傾向を解析したり可視化したりといったことが比較的簡単にできます

本テキストでは手っ取り早く Rの簡単な使い方を勉強します

1 Rの起動と終了

システムによって異なりますが通常はコマンドラインで R と入力するかR のアイコ

ンをダブルクリックして起動しますRを終了させるときは

q()

と入力します

2 簡単な変数への代入

変数とは様々な値を格納する箱のような概念です例えば今 x という変数を考えそこ

に 123を代入したければ

x lt- 123

としますその後に xと打ち込むと下記のように xの値が表示されます

gt x lt- 123

gt x

[1] 123

gt

実は Rは単一の数値だけでなく複数の数値をベクトルとして扱うことが得意です1例

えばベクトル(1 3 5)を変数 yに代入したければcという記号を先頭に付けて

y lt- c(1 3 5)

とします2から 5までの整数を含むベクトルを作成するにはy lt- c(2345)でもいいの

ですが

y lt- 25

と簡略化して書くことが可能です

課課題題 22--11 変数 zにベクトル(10 11 12)を代入しまたそれを表示してみましょう

1 単一の数値(スカラー)は実は一次元ベクトルとみなされると考えればよい

3

3 簡単な演算

R上では四則演算を含む様々な演算を行うことが可能です例えば 1+2 と入力すれば

以下のように 3という答えが返ってきます

gt 1 + 2

[1] 3

gt

+は加算-は減算は乗算は除算または^はべき乗を表します

ベクトルの演算も可能でc(1 2 3) + c(4 5 6)とすればベクトル(5 7 9)が返ってきま

すc(1 2 3) 2ならベクトル(2 4 6)が返ってくるはずです変数を含めた演算も可能

でxに c(1 2 3)yに(4 5 6)を代入しておくとx + yはベクトル(5 7 9)になります

演算を使って変数の値を変更することも可能ですx lt- c(1 2 3)の後

x lt- x 2

は xのベクトルの値を 2倍にしその結果が xに格納されます

課課題題 33--11 変数 xにベクトル(1 2 3)変数 yに 2を代入しx yを計算してみましょう

どんな答えが返ってきますか

課課題題 33--22 変数 xにベクトル(1 2 3)を代入しさらにそれを 3倍にした結果を xに格納し

ましょう

4 簡単なベクトル演算

既に説明したようにcの直後に括弧の中に入った数字を並べることでベクトルを表現す

ることができますベクトルの次元数すなわちベクトル中の数値の個数は

length(x)

で求めることができますその中から一部を取り出すことも可能です例えばx lt-

c(246810)とした後

x[3]

とすると3番目の数値 6を抽出することが可能です

x[c(24)]

で2番目と 4番目の数値を抽出できまた

x[24]

とすれば2番目から 4番目までの数値を抽出することが可能です

ベクトルの比較演算も可能で例えばベクトルの各要素が 5 より大きいかどうかを判定

するためにはx gt 5としますすると各要素が 5より大きいか大きくないかを判定した

結果が TRUE FALSEのベクトル(略して T F)として返ってきます

4

gt x lt- c(246810)

gt x

[1] 2 4 6 8 10

gt x gt 5

[1] FALSE FALSE TRUE TRUE TRUE

gt

whichを使うと何番目が Tなのかが返ってきます返ってきた T Fのベクトルを使っ

てさらに which(c(F F T T T))とするとベクトル(345)が返ってきますが一気に which(x

gt 5)としても同じ答えになります

gt x lt- c(246810)

gt which(x gt 5)

[1] 3 4 5

gt

この T Fのベクトルを使ってTの部分だけを抽出することが可能です

x[ c(F F T T T)]

以上をまとめてx gt 5の要素だけを抽出するには

x[ x gt 5 ]

とすることができます

実は数値だけでなく文字列もベクトルのように扱うことができて

x lt- c(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

とした後x[2]とすれば 2 番目の文字列rdquoMondayrdquoが取り出されます文字列のベクトルに

対しても様々な操作が可能で例えば

grep(ldquosdrdquo x)

は x の中でrdquosdrdquoという部分文字列が含まれているのは何番目の要素かをベクトルで返しま

す従って以下のようにするとrdquosdrdquoが含まれている文字列を抽出することができます

gt x lt- c(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

gt x[ grep(sd x) ]

[1] Tuesday Wednesday Thursday

gt

ベクトルの各要素には namesを使って名前を付けることができます例えば

x lt- c(2 4 6)

names(x) lt- c(First Second Third)

5

とするとxの namesという属性に(ldquoFirstrdquo ldquoSecondrdquo ldquoThirdrdquo)が付けられ

x[[ ldquoSecondrdquo ]]

で 2番目の値が抽出されます

さらに数値データのみで構成されるベクトルに対しては様々な統計関数が定義されてい

ます例えば

sum(x)

でベクトル xの合計

mean(x)

でxの平均が求められますさらにTまたはFから構成されるベクトルxについては sum(x)

で Tの数を数えるので

x lt- c(246810)

sum(x gt 5)

でベクトル xの要素の中で 5を超えるものがいくつあるかすなわち 3を返します

課課題題 44--11 ベクトル(3 1 4 1 5 9 2 6 5)の中で 5より大きい要素からなるベクトルを作成

しましょう

課課題題 44--22 ベクトル(123456789101112)に(ldquoJanrdquo ldquoFebrdquo ldquoMarrdquo ldquoAprrdquo ldquoMayrdquo ldquoJunrdquo

ldquoJulrdquo ldquoAugrdquo ldquoSeprdquo ldquoOctrdquo ldquoNovrdquo ldquoDecrdquo)という名前を付けrdquoMarrdquoという文字列を使って 3

番目の要素を取り出してみましょう

5 簡単な行列の作成と演算

ベクトルを集めるとrbind を使って行列を作成することが可能です例えば 1 行目が

(123)2行目が(456)の行列 x =

1 2 3

4 5 6

を作るには

x lt- rbind(c(123) c(456))

としますその後に xと入力すると作成した行列が表示されるのが分かります

gt x lt- rbind(c(123) c(456))

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt

これは

x lt- matrix(c(1 4 2 5 3 6) nrow=2 ncol=3)

6

または

x lt- matrix(c(1 2 3 4 5 6) nrow=2 ncol=3 byrow=T)

としても作成可能です上記は(1 2 3 4 5 6)を使って 2行 3列の行列を作成する(nrow=2

ncol=3)その際行から埋めてゆく(byrow=T)ということを表しています

作成した行列 x に対しては様々な演算が可能ですnrow(x) ncol(x)はそれぞれ x の行数

と列数を表しますx + 1は行列の各要素に 1を足した答えを返しx 2は各要素を 2倍

にした答えを返します行列同士の演算も可能でy lt- rbind(c(2 4 6) c(8 10 12))とした

後x + yとすると行列 xと yの対応する各要素同士を足し合わせた行列が返ってきます

x yなら各要素同士を掛け合わせた行列が返ってきます2

行列からは任意の行や列を簡単に取り出すことができます例えば2行目を取り出し

たい場合

gt x[2]

[1] 4 5 6

gt

としますまた2列目を取り出したい場合は

gt x[2]

[1] 2 5

とします

t(x)とすると行列 xが転置されます(行と列が入れ替わる)

gt t(x)

[1] [2]

[1] 1 4

[2] 2 5

[3] 3 6

gt

行列 xの各行の平均は以下のように求めることができます3

gt apply(x 1 mean)

[1] 2 5

行列 xの各列の平均は以下のように求めることができます

gt apply(x 2 mean)

2 行列の積はで計算する 3 applyの中の1は一次元目の各項番の平均すなわち各行の平均を計算することを意味す

る同様にして2は二次元目の各項番の平均すなわち各列の値の平均を計算すること

を意味する

7

[1] 25 35 45

行列は 2次元の数値の羅列ですがRでは array(ベクトル各次元の要素の個数)を使っ

てさらに n次元に拡張された配列を扱うことができます

x lt- array(124 c(342))

は 3times4times2 の大きさの3次元配列を作成し一番目の次元目の値から順番に埋めてゆきま

gt x lt- array(124 c(342))

gt x

1 3次元目の1番目の 3times4配列

[1] [2] [3] [4]

[1] 1 4 7 10

[2] 2 5 8 11

[3] 3 6 9 12

2 3次元目の 2番目の 3times4配列

[1] [2] [3] [4]

[1] 13 16 19 22

[2] 14 17 20 23

[3] 15 18 21 24

gt

課課題題 55--11

1 3 5

7 9 11

1 2 3

2 4 6

を計算しましょう

課課題題 55--22 上記結果に対して行列それぞれの平均を求めましょう

6 簡単なリストの作成

リストは様々な型のデータをひとまとめにして管理できるデータ型です

x lt- list(Oh Nomura Kadota)

はrdquoOhrdquordquoNomurardquordquoKadotardquoを要素とするリストを作成しますこれらは全て文字列です

がベクトルを織り交ぜることもできます

x lt- list(Oh Nomura Kadota c(868 657 567))

8

で最後にベクトル(1 2 3)が加わっていますここから2番目の要素を取り出すためには

x[[2]]

とします各々の要素に名前を付けることも可能です

x lt- list(First=Oh Second=Nomura Third=Kadota Home_Runs=c(868 657 567))

として各々の要素に First Second Third Home_Runsという名前が付いていることを確

認しましょう

gt x

$First

[1] Oh

$Second

[1] Nomura

$Third

[1] Kadota

$Home_Runs

[1] 868 657 567

gt

名前を使って個々の要素を取り出すためには(例えば2つ目の要素を取り出すには)

x[[Second]]

または

x$Second

とします

課課題題 66--11 名前が Yamagata のベクトル(ldquoTsuruokardquo ldquoSakatardquo ldquoYonezawardquo)と名前が

Niigataのベクトル(ldquoYuzawardquo ldquoNiitsurdquo ldquoShibatardquo)を要素にしたようなリストを作成しそ

の中味を表示してみましょう

9

7 簡単なデータフレームの作成

Rにはデータフレームと呼ばれる型が存在しますこれもリストの一種で行列と同じ二

次元配列ですデータフレームの各々の行は1つのサンプルに対する観測値各列はサン

プルに対する1つの項目とみなすことができますこれを使うと表を簡単に表現するこ

とができます以下の表は日本プロ野球の5人の元選手の名前在籍チーム名通算打数

安打数本塁打数を表したものです

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

これをデータフレームを使って表すと以下のようになります

x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

データフレームを作り出す関数 dataframeは dataframe(rownames = 列のラベルのベク

トル列名 1 = ベクトル 1列名 2 = ベクトル 2 )の形式で使うことができますxの中

味は以下のようになっていることが分かります

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

通常のリストと同様列名を使って対応するベクトルを抽出することができます

gt x$Hits

[1] 2901 3085 2543 2786 2566

gt

10

データフレームからは任意の部分をさらにデータフレームとして抽出することができ

ます例えば 15行目と 234列目を抽出する場合

x[ c(15) c(234) ]

とします4

データフレームに対してさらに様々な処理が可能ですまずは上記で定義された x にど

のような属性があるのかattributesで調べてみましょう

gt attributes(x)

$names

[1] Team At_Bat Hits Home_Runs

$rownames

[1] Nomura Harimoto Kinugasa Oh Kadota

$class

[1] dataframe

gt

属性としてnames rownames class が出てきましたnames(x)rownames(x)class(x)

と入力してみましょうそれぞれ列名行名xの型が出てくるでしょう

課課題題 77--11 下の表は G8 加盟国の国力の一部ですこれをデータフレームとして変数にしま

しょう5

Area Population GDP

USA 94 315 14

England 02 62 3

Italy 03 60 2

Canada 100 34 2

Germany 03 82 4

Japan 03 127 5

France 05 62 3

Russia 171 141 2

4 x[c(Nomura Kadota)c(At_Bat Hits Home_Runs)]でも同様に

動作する 5 要素が全て数値なので行列として扱うこともできるデータフレームにしてしまった

変数 xに対しては行列演算ができないことがあるのでその場合は asmatrix(x)で行列に

変換する

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 3: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

3

3 簡単な演算

R上では四則演算を含む様々な演算を行うことが可能です例えば 1+2 と入力すれば

以下のように 3という答えが返ってきます

gt 1 + 2

[1] 3

gt

+は加算-は減算は乗算は除算または^はべき乗を表します

ベクトルの演算も可能でc(1 2 3) + c(4 5 6)とすればベクトル(5 7 9)が返ってきま

すc(1 2 3) 2ならベクトル(2 4 6)が返ってくるはずです変数を含めた演算も可能

でxに c(1 2 3)yに(4 5 6)を代入しておくとx + yはベクトル(5 7 9)になります

演算を使って変数の値を変更することも可能ですx lt- c(1 2 3)の後

x lt- x 2

は xのベクトルの値を 2倍にしその結果が xに格納されます

課課題題 33--11 変数 xにベクトル(1 2 3)変数 yに 2を代入しx yを計算してみましょう

どんな答えが返ってきますか

課課題題 33--22 変数 xにベクトル(1 2 3)を代入しさらにそれを 3倍にした結果を xに格納し

ましょう

4 簡単なベクトル演算

既に説明したようにcの直後に括弧の中に入った数字を並べることでベクトルを表現す

ることができますベクトルの次元数すなわちベクトル中の数値の個数は

length(x)

で求めることができますその中から一部を取り出すことも可能です例えばx lt-

c(246810)とした後

x[3]

とすると3番目の数値 6を抽出することが可能です

x[c(24)]

で2番目と 4番目の数値を抽出できまた

x[24]

とすれば2番目から 4番目までの数値を抽出することが可能です

ベクトルの比較演算も可能で例えばベクトルの各要素が 5 より大きいかどうかを判定

するためにはx gt 5としますすると各要素が 5より大きいか大きくないかを判定した

結果が TRUE FALSEのベクトル(略して T F)として返ってきます

4

gt x lt- c(246810)

gt x

[1] 2 4 6 8 10

gt x gt 5

[1] FALSE FALSE TRUE TRUE TRUE

gt

whichを使うと何番目が Tなのかが返ってきます返ってきた T Fのベクトルを使っ

てさらに which(c(F F T T T))とするとベクトル(345)が返ってきますが一気に which(x

gt 5)としても同じ答えになります

gt x lt- c(246810)

gt which(x gt 5)

[1] 3 4 5

gt

この T Fのベクトルを使ってTの部分だけを抽出することが可能です

x[ c(F F T T T)]

以上をまとめてx gt 5の要素だけを抽出するには

x[ x gt 5 ]

とすることができます

実は数値だけでなく文字列もベクトルのように扱うことができて

x lt- c(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

とした後x[2]とすれば 2 番目の文字列rdquoMondayrdquoが取り出されます文字列のベクトルに

対しても様々な操作が可能で例えば

grep(ldquosdrdquo x)

は x の中でrdquosdrdquoという部分文字列が含まれているのは何番目の要素かをベクトルで返しま

す従って以下のようにするとrdquosdrdquoが含まれている文字列を抽出することができます

gt x lt- c(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

gt x[ grep(sd x) ]

[1] Tuesday Wednesday Thursday

gt

ベクトルの各要素には namesを使って名前を付けることができます例えば

x lt- c(2 4 6)

names(x) lt- c(First Second Third)

5

とするとxの namesという属性に(ldquoFirstrdquo ldquoSecondrdquo ldquoThirdrdquo)が付けられ

x[[ ldquoSecondrdquo ]]

で 2番目の値が抽出されます

さらに数値データのみで構成されるベクトルに対しては様々な統計関数が定義されてい

ます例えば

sum(x)

でベクトル xの合計

mean(x)

でxの平均が求められますさらにTまたはFから構成されるベクトルxについては sum(x)

で Tの数を数えるので

x lt- c(246810)

sum(x gt 5)

でベクトル xの要素の中で 5を超えるものがいくつあるかすなわち 3を返します

課課題題 44--11 ベクトル(3 1 4 1 5 9 2 6 5)の中で 5より大きい要素からなるベクトルを作成

しましょう

課課題題 44--22 ベクトル(123456789101112)に(ldquoJanrdquo ldquoFebrdquo ldquoMarrdquo ldquoAprrdquo ldquoMayrdquo ldquoJunrdquo

ldquoJulrdquo ldquoAugrdquo ldquoSeprdquo ldquoOctrdquo ldquoNovrdquo ldquoDecrdquo)という名前を付けrdquoMarrdquoという文字列を使って 3

番目の要素を取り出してみましょう

5 簡単な行列の作成と演算

ベクトルを集めるとrbind を使って行列を作成することが可能です例えば 1 行目が

(123)2行目が(456)の行列 x =

1 2 3

4 5 6

を作るには

x lt- rbind(c(123) c(456))

としますその後に xと入力すると作成した行列が表示されるのが分かります

gt x lt- rbind(c(123) c(456))

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt

これは

x lt- matrix(c(1 4 2 5 3 6) nrow=2 ncol=3)

6

または

x lt- matrix(c(1 2 3 4 5 6) nrow=2 ncol=3 byrow=T)

としても作成可能です上記は(1 2 3 4 5 6)を使って 2行 3列の行列を作成する(nrow=2

ncol=3)その際行から埋めてゆく(byrow=T)ということを表しています

作成した行列 x に対しては様々な演算が可能ですnrow(x) ncol(x)はそれぞれ x の行数

と列数を表しますx + 1は行列の各要素に 1を足した答えを返しx 2は各要素を 2倍

にした答えを返します行列同士の演算も可能でy lt- rbind(c(2 4 6) c(8 10 12))とした

後x + yとすると行列 xと yの対応する各要素同士を足し合わせた行列が返ってきます

x yなら各要素同士を掛け合わせた行列が返ってきます2

行列からは任意の行や列を簡単に取り出すことができます例えば2行目を取り出し

たい場合

gt x[2]

[1] 4 5 6

gt

としますまた2列目を取り出したい場合は

gt x[2]

[1] 2 5

とします

t(x)とすると行列 xが転置されます(行と列が入れ替わる)

gt t(x)

[1] [2]

[1] 1 4

[2] 2 5

[3] 3 6

gt

行列 xの各行の平均は以下のように求めることができます3

gt apply(x 1 mean)

[1] 2 5

行列 xの各列の平均は以下のように求めることができます

gt apply(x 2 mean)

2 行列の積はで計算する 3 applyの中の1は一次元目の各項番の平均すなわち各行の平均を計算することを意味す

る同様にして2は二次元目の各項番の平均すなわち各列の値の平均を計算すること

を意味する

7

[1] 25 35 45

行列は 2次元の数値の羅列ですがRでは array(ベクトル各次元の要素の個数)を使っ

てさらに n次元に拡張された配列を扱うことができます

x lt- array(124 c(342))

は 3times4times2 の大きさの3次元配列を作成し一番目の次元目の値から順番に埋めてゆきま

gt x lt- array(124 c(342))

gt x

1 3次元目の1番目の 3times4配列

[1] [2] [3] [4]

[1] 1 4 7 10

[2] 2 5 8 11

[3] 3 6 9 12

2 3次元目の 2番目の 3times4配列

[1] [2] [3] [4]

[1] 13 16 19 22

[2] 14 17 20 23

[3] 15 18 21 24

gt

課課題題 55--11

1 3 5

7 9 11

1 2 3

2 4 6

を計算しましょう

課課題題 55--22 上記結果に対して行列それぞれの平均を求めましょう

6 簡単なリストの作成

リストは様々な型のデータをひとまとめにして管理できるデータ型です

x lt- list(Oh Nomura Kadota)

はrdquoOhrdquordquoNomurardquordquoKadotardquoを要素とするリストを作成しますこれらは全て文字列です

がベクトルを織り交ぜることもできます

x lt- list(Oh Nomura Kadota c(868 657 567))

8

で最後にベクトル(1 2 3)が加わっていますここから2番目の要素を取り出すためには

x[[2]]

とします各々の要素に名前を付けることも可能です

x lt- list(First=Oh Second=Nomura Third=Kadota Home_Runs=c(868 657 567))

として各々の要素に First Second Third Home_Runsという名前が付いていることを確

認しましょう

gt x

$First

[1] Oh

$Second

[1] Nomura

$Third

[1] Kadota

$Home_Runs

[1] 868 657 567

gt

名前を使って個々の要素を取り出すためには(例えば2つ目の要素を取り出すには)

x[[Second]]

または

x$Second

とします

課課題題 66--11 名前が Yamagata のベクトル(ldquoTsuruokardquo ldquoSakatardquo ldquoYonezawardquo)と名前が

Niigataのベクトル(ldquoYuzawardquo ldquoNiitsurdquo ldquoShibatardquo)を要素にしたようなリストを作成しそ

の中味を表示してみましょう

9

7 簡単なデータフレームの作成

Rにはデータフレームと呼ばれる型が存在しますこれもリストの一種で行列と同じ二

次元配列ですデータフレームの各々の行は1つのサンプルに対する観測値各列はサン

プルに対する1つの項目とみなすことができますこれを使うと表を簡単に表現するこ

とができます以下の表は日本プロ野球の5人の元選手の名前在籍チーム名通算打数

安打数本塁打数を表したものです

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

これをデータフレームを使って表すと以下のようになります

x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

データフレームを作り出す関数 dataframeは dataframe(rownames = 列のラベルのベク

トル列名 1 = ベクトル 1列名 2 = ベクトル 2 )の形式で使うことができますxの中

味は以下のようになっていることが分かります

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

通常のリストと同様列名を使って対応するベクトルを抽出することができます

gt x$Hits

[1] 2901 3085 2543 2786 2566

gt

10

データフレームからは任意の部分をさらにデータフレームとして抽出することができ

ます例えば 15行目と 234列目を抽出する場合

x[ c(15) c(234) ]

とします4

データフレームに対してさらに様々な処理が可能ですまずは上記で定義された x にど

のような属性があるのかattributesで調べてみましょう

gt attributes(x)

$names

[1] Team At_Bat Hits Home_Runs

$rownames

[1] Nomura Harimoto Kinugasa Oh Kadota

$class

[1] dataframe

gt

属性としてnames rownames class が出てきましたnames(x)rownames(x)class(x)

と入力してみましょうそれぞれ列名行名xの型が出てくるでしょう

課課題題 77--11 下の表は G8 加盟国の国力の一部ですこれをデータフレームとして変数にしま

しょう5

Area Population GDP

USA 94 315 14

England 02 62 3

Italy 03 60 2

Canada 100 34 2

Germany 03 82 4

Japan 03 127 5

France 05 62 3

Russia 171 141 2

4 x[c(Nomura Kadota)c(At_Bat Hits Home_Runs)]でも同様に

動作する 5 要素が全て数値なので行列として扱うこともできるデータフレームにしてしまった

変数 xに対しては行列演算ができないことがあるのでその場合は asmatrix(x)で行列に

変換する

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 4: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

4

gt x lt- c(246810)

gt x

[1] 2 4 6 8 10

gt x gt 5

[1] FALSE FALSE TRUE TRUE TRUE

gt

whichを使うと何番目が Tなのかが返ってきます返ってきた T Fのベクトルを使っ

てさらに which(c(F F T T T))とするとベクトル(345)が返ってきますが一気に which(x

gt 5)としても同じ答えになります

gt x lt- c(246810)

gt which(x gt 5)

[1] 3 4 5

gt

この T Fのベクトルを使ってTの部分だけを抽出することが可能です

x[ c(F F T T T)]

以上をまとめてx gt 5の要素だけを抽出するには

x[ x gt 5 ]

とすることができます

実は数値だけでなく文字列もベクトルのように扱うことができて

x lt- c(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

とした後x[2]とすれば 2 番目の文字列rdquoMondayrdquoが取り出されます文字列のベクトルに

対しても様々な操作が可能で例えば

grep(ldquosdrdquo x)

は x の中でrdquosdrdquoという部分文字列が含まれているのは何番目の要素かをベクトルで返しま

す従って以下のようにするとrdquosdrdquoが含まれている文字列を抽出することができます

gt x lt- c(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

gt x[ grep(sd x) ]

[1] Tuesday Wednesday Thursday

gt

ベクトルの各要素には namesを使って名前を付けることができます例えば

x lt- c(2 4 6)

names(x) lt- c(First Second Third)

5

とするとxの namesという属性に(ldquoFirstrdquo ldquoSecondrdquo ldquoThirdrdquo)が付けられ

x[[ ldquoSecondrdquo ]]

で 2番目の値が抽出されます

さらに数値データのみで構成されるベクトルに対しては様々な統計関数が定義されてい

ます例えば

sum(x)

でベクトル xの合計

mean(x)

でxの平均が求められますさらにTまたはFから構成されるベクトルxについては sum(x)

で Tの数を数えるので

x lt- c(246810)

sum(x gt 5)

でベクトル xの要素の中で 5を超えるものがいくつあるかすなわち 3を返します

課課題題 44--11 ベクトル(3 1 4 1 5 9 2 6 5)の中で 5より大きい要素からなるベクトルを作成

しましょう

課課題題 44--22 ベクトル(123456789101112)に(ldquoJanrdquo ldquoFebrdquo ldquoMarrdquo ldquoAprrdquo ldquoMayrdquo ldquoJunrdquo

ldquoJulrdquo ldquoAugrdquo ldquoSeprdquo ldquoOctrdquo ldquoNovrdquo ldquoDecrdquo)という名前を付けrdquoMarrdquoという文字列を使って 3

番目の要素を取り出してみましょう

5 簡単な行列の作成と演算

ベクトルを集めるとrbind を使って行列を作成することが可能です例えば 1 行目が

(123)2行目が(456)の行列 x =

1 2 3

4 5 6

を作るには

x lt- rbind(c(123) c(456))

としますその後に xと入力すると作成した行列が表示されるのが分かります

gt x lt- rbind(c(123) c(456))

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt

これは

x lt- matrix(c(1 4 2 5 3 6) nrow=2 ncol=3)

6

または

x lt- matrix(c(1 2 3 4 5 6) nrow=2 ncol=3 byrow=T)

としても作成可能です上記は(1 2 3 4 5 6)を使って 2行 3列の行列を作成する(nrow=2

ncol=3)その際行から埋めてゆく(byrow=T)ということを表しています

作成した行列 x に対しては様々な演算が可能ですnrow(x) ncol(x)はそれぞれ x の行数

と列数を表しますx + 1は行列の各要素に 1を足した答えを返しx 2は各要素を 2倍

にした答えを返します行列同士の演算も可能でy lt- rbind(c(2 4 6) c(8 10 12))とした

後x + yとすると行列 xと yの対応する各要素同士を足し合わせた行列が返ってきます

x yなら各要素同士を掛け合わせた行列が返ってきます2

行列からは任意の行や列を簡単に取り出すことができます例えば2行目を取り出し

たい場合

gt x[2]

[1] 4 5 6

gt

としますまた2列目を取り出したい場合は

gt x[2]

[1] 2 5

とします

t(x)とすると行列 xが転置されます(行と列が入れ替わる)

gt t(x)

[1] [2]

[1] 1 4

[2] 2 5

[3] 3 6

gt

行列 xの各行の平均は以下のように求めることができます3

gt apply(x 1 mean)

[1] 2 5

行列 xの各列の平均は以下のように求めることができます

gt apply(x 2 mean)

2 行列の積はで計算する 3 applyの中の1は一次元目の各項番の平均すなわち各行の平均を計算することを意味す

る同様にして2は二次元目の各項番の平均すなわち各列の値の平均を計算すること

を意味する

7

[1] 25 35 45

行列は 2次元の数値の羅列ですがRでは array(ベクトル各次元の要素の個数)を使っ

てさらに n次元に拡張された配列を扱うことができます

x lt- array(124 c(342))

は 3times4times2 の大きさの3次元配列を作成し一番目の次元目の値から順番に埋めてゆきま

gt x lt- array(124 c(342))

gt x

1 3次元目の1番目の 3times4配列

[1] [2] [3] [4]

[1] 1 4 7 10

[2] 2 5 8 11

[3] 3 6 9 12

2 3次元目の 2番目の 3times4配列

[1] [2] [3] [4]

[1] 13 16 19 22

[2] 14 17 20 23

[3] 15 18 21 24

gt

課課題題 55--11

1 3 5

7 9 11

1 2 3

2 4 6

を計算しましょう

課課題題 55--22 上記結果に対して行列それぞれの平均を求めましょう

6 簡単なリストの作成

リストは様々な型のデータをひとまとめにして管理できるデータ型です

x lt- list(Oh Nomura Kadota)

はrdquoOhrdquordquoNomurardquordquoKadotardquoを要素とするリストを作成しますこれらは全て文字列です

がベクトルを織り交ぜることもできます

x lt- list(Oh Nomura Kadota c(868 657 567))

8

で最後にベクトル(1 2 3)が加わっていますここから2番目の要素を取り出すためには

x[[2]]

とします各々の要素に名前を付けることも可能です

x lt- list(First=Oh Second=Nomura Third=Kadota Home_Runs=c(868 657 567))

として各々の要素に First Second Third Home_Runsという名前が付いていることを確

認しましょう

gt x

$First

[1] Oh

$Second

[1] Nomura

$Third

[1] Kadota

$Home_Runs

[1] 868 657 567

gt

名前を使って個々の要素を取り出すためには(例えば2つ目の要素を取り出すには)

x[[Second]]

または

x$Second

とします

課課題題 66--11 名前が Yamagata のベクトル(ldquoTsuruokardquo ldquoSakatardquo ldquoYonezawardquo)と名前が

Niigataのベクトル(ldquoYuzawardquo ldquoNiitsurdquo ldquoShibatardquo)を要素にしたようなリストを作成しそ

の中味を表示してみましょう

9

7 簡単なデータフレームの作成

Rにはデータフレームと呼ばれる型が存在しますこれもリストの一種で行列と同じ二

次元配列ですデータフレームの各々の行は1つのサンプルに対する観測値各列はサン

プルに対する1つの項目とみなすことができますこれを使うと表を簡単に表現するこ

とができます以下の表は日本プロ野球の5人の元選手の名前在籍チーム名通算打数

安打数本塁打数を表したものです

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

これをデータフレームを使って表すと以下のようになります

x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

データフレームを作り出す関数 dataframeは dataframe(rownames = 列のラベルのベク

トル列名 1 = ベクトル 1列名 2 = ベクトル 2 )の形式で使うことができますxの中

味は以下のようになっていることが分かります

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

通常のリストと同様列名を使って対応するベクトルを抽出することができます

gt x$Hits

[1] 2901 3085 2543 2786 2566

gt

10

データフレームからは任意の部分をさらにデータフレームとして抽出することができ

ます例えば 15行目と 234列目を抽出する場合

x[ c(15) c(234) ]

とします4

データフレームに対してさらに様々な処理が可能ですまずは上記で定義された x にど

のような属性があるのかattributesで調べてみましょう

gt attributes(x)

$names

[1] Team At_Bat Hits Home_Runs

$rownames

[1] Nomura Harimoto Kinugasa Oh Kadota

$class

[1] dataframe

gt

属性としてnames rownames class が出てきましたnames(x)rownames(x)class(x)

と入力してみましょうそれぞれ列名行名xの型が出てくるでしょう

課課題題 77--11 下の表は G8 加盟国の国力の一部ですこれをデータフレームとして変数にしま

しょう5

Area Population GDP

USA 94 315 14

England 02 62 3

Italy 03 60 2

Canada 100 34 2

Germany 03 82 4

Japan 03 127 5

France 05 62 3

Russia 171 141 2

4 x[c(Nomura Kadota)c(At_Bat Hits Home_Runs)]でも同様に

動作する 5 要素が全て数値なので行列として扱うこともできるデータフレームにしてしまった

変数 xに対しては行列演算ができないことがあるのでその場合は asmatrix(x)で行列に

変換する

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 5: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

5

とするとxの namesという属性に(ldquoFirstrdquo ldquoSecondrdquo ldquoThirdrdquo)が付けられ

x[[ ldquoSecondrdquo ]]

で 2番目の値が抽出されます

さらに数値データのみで構成されるベクトルに対しては様々な統計関数が定義されてい

ます例えば

sum(x)

でベクトル xの合計

mean(x)

でxの平均が求められますさらにTまたはFから構成されるベクトルxについては sum(x)

で Tの数を数えるので

x lt- c(246810)

sum(x gt 5)

でベクトル xの要素の中で 5を超えるものがいくつあるかすなわち 3を返します

課課題題 44--11 ベクトル(3 1 4 1 5 9 2 6 5)の中で 5より大きい要素からなるベクトルを作成

しましょう

課課題題 44--22 ベクトル(123456789101112)に(ldquoJanrdquo ldquoFebrdquo ldquoMarrdquo ldquoAprrdquo ldquoMayrdquo ldquoJunrdquo

ldquoJulrdquo ldquoAugrdquo ldquoSeprdquo ldquoOctrdquo ldquoNovrdquo ldquoDecrdquo)という名前を付けrdquoMarrdquoという文字列を使って 3

番目の要素を取り出してみましょう

5 簡単な行列の作成と演算

ベクトルを集めるとrbind を使って行列を作成することが可能です例えば 1 行目が

(123)2行目が(456)の行列 x =

1 2 3

4 5 6

を作るには

x lt- rbind(c(123) c(456))

としますその後に xと入力すると作成した行列が表示されるのが分かります

gt x lt- rbind(c(123) c(456))

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt

これは

x lt- matrix(c(1 4 2 5 3 6) nrow=2 ncol=3)

6

または

x lt- matrix(c(1 2 3 4 5 6) nrow=2 ncol=3 byrow=T)

としても作成可能です上記は(1 2 3 4 5 6)を使って 2行 3列の行列を作成する(nrow=2

ncol=3)その際行から埋めてゆく(byrow=T)ということを表しています

作成した行列 x に対しては様々な演算が可能ですnrow(x) ncol(x)はそれぞれ x の行数

と列数を表しますx + 1は行列の各要素に 1を足した答えを返しx 2は各要素を 2倍

にした答えを返します行列同士の演算も可能でy lt- rbind(c(2 4 6) c(8 10 12))とした

後x + yとすると行列 xと yの対応する各要素同士を足し合わせた行列が返ってきます

x yなら各要素同士を掛け合わせた行列が返ってきます2

行列からは任意の行や列を簡単に取り出すことができます例えば2行目を取り出し

たい場合

gt x[2]

[1] 4 5 6

gt

としますまた2列目を取り出したい場合は

gt x[2]

[1] 2 5

とします

t(x)とすると行列 xが転置されます(行と列が入れ替わる)

gt t(x)

[1] [2]

[1] 1 4

[2] 2 5

[3] 3 6

gt

行列 xの各行の平均は以下のように求めることができます3

gt apply(x 1 mean)

[1] 2 5

行列 xの各列の平均は以下のように求めることができます

gt apply(x 2 mean)

2 行列の積はで計算する 3 applyの中の1は一次元目の各項番の平均すなわち各行の平均を計算することを意味す

る同様にして2は二次元目の各項番の平均すなわち各列の値の平均を計算すること

を意味する

7

[1] 25 35 45

行列は 2次元の数値の羅列ですがRでは array(ベクトル各次元の要素の個数)を使っ

てさらに n次元に拡張された配列を扱うことができます

x lt- array(124 c(342))

は 3times4times2 の大きさの3次元配列を作成し一番目の次元目の値から順番に埋めてゆきま

gt x lt- array(124 c(342))

gt x

1 3次元目の1番目の 3times4配列

[1] [2] [3] [4]

[1] 1 4 7 10

[2] 2 5 8 11

[3] 3 6 9 12

2 3次元目の 2番目の 3times4配列

[1] [2] [3] [4]

[1] 13 16 19 22

[2] 14 17 20 23

[3] 15 18 21 24

gt

課課題題 55--11

1 3 5

7 9 11

1 2 3

2 4 6

を計算しましょう

課課題題 55--22 上記結果に対して行列それぞれの平均を求めましょう

6 簡単なリストの作成

リストは様々な型のデータをひとまとめにして管理できるデータ型です

x lt- list(Oh Nomura Kadota)

はrdquoOhrdquordquoNomurardquordquoKadotardquoを要素とするリストを作成しますこれらは全て文字列です

がベクトルを織り交ぜることもできます

x lt- list(Oh Nomura Kadota c(868 657 567))

8

で最後にベクトル(1 2 3)が加わっていますここから2番目の要素を取り出すためには

x[[2]]

とします各々の要素に名前を付けることも可能です

x lt- list(First=Oh Second=Nomura Third=Kadota Home_Runs=c(868 657 567))

として各々の要素に First Second Third Home_Runsという名前が付いていることを確

認しましょう

gt x

$First

[1] Oh

$Second

[1] Nomura

$Third

[1] Kadota

$Home_Runs

[1] 868 657 567

gt

名前を使って個々の要素を取り出すためには(例えば2つ目の要素を取り出すには)

x[[Second]]

または

x$Second

とします

課課題題 66--11 名前が Yamagata のベクトル(ldquoTsuruokardquo ldquoSakatardquo ldquoYonezawardquo)と名前が

Niigataのベクトル(ldquoYuzawardquo ldquoNiitsurdquo ldquoShibatardquo)を要素にしたようなリストを作成しそ

の中味を表示してみましょう

9

7 簡単なデータフレームの作成

Rにはデータフレームと呼ばれる型が存在しますこれもリストの一種で行列と同じ二

次元配列ですデータフレームの各々の行は1つのサンプルに対する観測値各列はサン

プルに対する1つの項目とみなすことができますこれを使うと表を簡単に表現するこ

とができます以下の表は日本プロ野球の5人の元選手の名前在籍チーム名通算打数

安打数本塁打数を表したものです

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

これをデータフレームを使って表すと以下のようになります

x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

データフレームを作り出す関数 dataframeは dataframe(rownames = 列のラベルのベク

トル列名 1 = ベクトル 1列名 2 = ベクトル 2 )の形式で使うことができますxの中

味は以下のようになっていることが分かります

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

通常のリストと同様列名を使って対応するベクトルを抽出することができます

gt x$Hits

[1] 2901 3085 2543 2786 2566

gt

10

データフレームからは任意の部分をさらにデータフレームとして抽出することができ

ます例えば 15行目と 234列目を抽出する場合

x[ c(15) c(234) ]

とします4

データフレームに対してさらに様々な処理が可能ですまずは上記で定義された x にど

のような属性があるのかattributesで調べてみましょう

gt attributes(x)

$names

[1] Team At_Bat Hits Home_Runs

$rownames

[1] Nomura Harimoto Kinugasa Oh Kadota

$class

[1] dataframe

gt

属性としてnames rownames class が出てきましたnames(x)rownames(x)class(x)

と入力してみましょうそれぞれ列名行名xの型が出てくるでしょう

課課題題 77--11 下の表は G8 加盟国の国力の一部ですこれをデータフレームとして変数にしま

しょう5

Area Population GDP

USA 94 315 14

England 02 62 3

Italy 03 60 2

Canada 100 34 2

Germany 03 82 4

Japan 03 127 5

France 05 62 3

Russia 171 141 2

4 x[c(Nomura Kadota)c(At_Bat Hits Home_Runs)]でも同様に

動作する 5 要素が全て数値なので行列として扱うこともできるデータフレームにしてしまった

変数 xに対しては行列演算ができないことがあるのでその場合は asmatrix(x)で行列に

変換する

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 6: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

6

または

x lt- matrix(c(1 2 3 4 5 6) nrow=2 ncol=3 byrow=T)

としても作成可能です上記は(1 2 3 4 5 6)を使って 2行 3列の行列を作成する(nrow=2

ncol=3)その際行から埋めてゆく(byrow=T)ということを表しています

作成した行列 x に対しては様々な演算が可能ですnrow(x) ncol(x)はそれぞれ x の行数

と列数を表しますx + 1は行列の各要素に 1を足した答えを返しx 2は各要素を 2倍

にした答えを返します行列同士の演算も可能でy lt- rbind(c(2 4 6) c(8 10 12))とした

後x + yとすると行列 xと yの対応する各要素同士を足し合わせた行列が返ってきます

x yなら各要素同士を掛け合わせた行列が返ってきます2

行列からは任意の行や列を簡単に取り出すことができます例えば2行目を取り出し

たい場合

gt x[2]

[1] 4 5 6

gt

としますまた2列目を取り出したい場合は

gt x[2]

[1] 2 5

とします

t(x)とすると行列 xが転置されます(行と列が入れ替わる)

gt t(x)

[1] [2]

[1] 1 4

[2] 2 5

[3] 3 6

gt

行列 xの各行の平均は以下のように求めることができます3

gt apply(x 1 mean)

[1] 2 5

行列 xの各列の平均は以下のように求めることができます

gt apply(x 2 mean)

2 行列の積はで計算する 3 applyの中の1は一次元目の各項番の平均すなわち各行の平均を計算することを意味す

る同様にして2は二次元目の各項番の平均すなわち各列の値の平均を計算すること

を意味する

7

[1] 25 35 45

行列は 2次元の数値の羅列ですがRでは array(ベクトル各次元の要素の個数)を使っ

てさらに n次元に拡張された配列を扱うことができます

x lt- array(124 c(342))

は 3times4times2 の大きさの3次元配列を作成し一番目の次元目の値から順番に埋めてゆきま

gt x lt- array(124 c(342))

gt x

1 3次元目の1番目の 3times4配列

[1] [2] [3] [4]

[1] 1 4 7 10

[2] 2 5 8 11

[3] 3 6 9 12

2 3次元目の 2番目の 3times4配列

[1] [2] [3] [4]

[1] 13 16 19 22

[2] 14 17 20 23

[3] 15 18 21 24

gt

課課題題 55--11

1 3 5

7 9 11

1 2 3

2 4 6

を計算しましょう

課課題題 55--22 上記結果に対して行列それぞれの平均を求めましょう

6 簡単なリストの作成

リストは様々な型のデータをひとまとめにして管理できるデータ型です

x lt- list(Oh Nomura Kadota)

はrdquoOhrdquordquoNomurardquordquoKadotardquoを要素とするリストを作成しますこれらは全て文字列です

がベクトルを織り交ぜることもできます

x lt- list(Oh Nomura Kadota c(868 657 567))

8

で最後にベクトル(1 2 3)が加わっていますここから2番目の要素を取り出すためには

x[[2]]

とします各々の要素に名前を付けることも可能です

x lt- list(First=Oh Second=Nomura Third=Kadota Home_Runs=c(868 657 567))

として各々の要素に First Second Third Home_Runsという名前が付いていることを確

認しましょう

gt x

$First

[1] Oh

$Second

[1] Nomura

$Third

[1] Kadota

$Home_Runs

[1] 868 657 567

gt

名前を使って個々の要素を取り出すためには(例えば2つ目の要素を取り出すには)

x[[Second]]

または

x$Second

とします

課課題題 66--11 名前が Yamagata のベクトル(ldquoTsuruokardquo ldquoSakatardquo ldquoYonezawardquo)と名前が

Niigataのベクトル(ldquoYuzawardquo ldquoNiitsurdquo ldquoShibatardquo)を要素にしたようなリストを作成しそ

の中味を表示してみましょう

9

7 簡単なデータフレームの作成

Rにはデータフレームと呼ばれる型が存在しますこれもリストの一種で行列と同じ二

次元配列ですデータフレームの各々の行は1つのサンプルに対する観測値各列はサン

プルに対する1つの項目とみなすことができますこれを使うと表を簡単に表現するこ

とができます以下の表は日本プロ野球の5人の元選手の名前在籍チーム名通算打数

安打数本塁打数を表したものです

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

これをデータフレームを使って表すと以下のようになります

x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

データフレームを作り出す関数 dataframeは dataframe(rownames = 列のラベルのベク

トル列名 1 = ベクトル 1列名 2 = ベクトル 2 )の形式で使うことができますxの中

味は以下のようになっていることが分かります

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

通常のリストと同様列名を使って対応するベクトルを抽出することができます

gt x$Hits

[1] 2901 3085 2543 2786 2566

gt

10

データフレームからは任意の部分をさらにデータフレームとして抽出することができ

ます例えば 15行目と 234列目を抽出する場合

x[ c(15) c(234) ]

とします4

データフレームに対してさらに様々な処理が可能ですまずは上記で定義された x にど

のような属性があるのかattributesで調べてみましょう

gt attributes(x)

$names

[1] Team At_Bat Hits Home_Runs

$rownames

[1] Nomura Harimoto Kinugasa Oh Kadota

$class

[1] dataframe

gt

属性としてnames rownames class が出てきましたnames(x)rownames(x)class(x)

と入力してみましょうそれぞれ列名行名xの型が出てくるでしょう

課課題題 77--11 下の表は G8 加盟国の国力の一部ですこれをデータフレームとして変数にしま

しょう5

Area Population GDP

USA 94 315 14

England 02 62 3

Italy 03 60 2

Canada 100 34 2

Germany 03 82 4

Japan 03 127 5

France 05 62 3

Russia 171 141 2

4 x[c(Nomura Kadota)c(At_Bat Hits Home_Runs)]でも同様に

動作する 5 要素が全て数値なので行列として扱うこともできるデータフレームにしてしまった

変数 xに対しては行列演算ができないことがあるのでその場合は asmatrix(x)で行列に

変換する

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 7: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

7

[1] 25 35 45

行列は 2次元の数値の羅列ですがRでは array(ベクトル各次元の要素の個数)を使っ

てさらに n次元に拡張された配列を扱うことができます

x lt- array(124 c(342))

は 3times4times2 の大きさの3次元配列を作成し一番目の次元目の値から順番に埋めてゆきま

gt x lt- array(124 c(342))

gt x

1 3次元目の1番目の 3times4配列

[1] [2] [3] [4]

[1] 1 4 7 10

[2] 2 5 8 11

[3] 3 6 9 12

2 3次元目の 2番目の 3times4配列

[1] [2] [3] [4]

[1] 13 16 19 22

[2] 14 17 20 23

[3] 15 18 21 24

gt

課課題題 55--11

1 3 5

7 9 11

1 2 3

2 4 6

を計算しましょう

課課題題 55--22 上記結果に対して行列それぞれの平均を求めましょう

6 簡単なリストの作成

リストは様々な型のデータをひとまとめにして管理できるデータ型です

x lt- list(Oh Nomura Kadota)

はrdquoOhrdquordquoNomurardquordquoKadotardquoを要素とするリストを作成しますこれらは全て文字列です

がベクトルを織り交ぜることもできます

x lt- list(Oh Nomura Kadota c(868 657 567))

8

で最後にベクトル(1 2 3)が加わっていますここから2番目の要素を取り出すためには

x[[2]]

とします各々の要素に名前を付けることも可能です

x lt- list(First=Oh Second=Nomura Third=Kadota Home_Runs=c(868 657 567))

として各々の要素に First Second Third Home_Runsという名前が付いていることを確

認しましょう

gt x

$First

[1] Oh

$Second

[1] Nomura

$Third

[1] Kadota

$Home_Runs

[1] 868 657 567

gt

名前を使って個々の要素を取り出すためには(例えば2つ目の要素を取り出すには)

x[[Second]]

または

x$Second

とします

課課題題 66--11 名前が Yamagata のベクトル(ldquoTsuruokardquo ldquoSakatardquo ldquoYonezawardquo)と名前が

Niigataのベクトル(ldquoYuzawardquo ldquoNiitsurdquo ldquoShibatardquo)を要素にしたようなリストを作成しそ

の中味を表示してみましょう

9

7 簡単なデータフレームの作成

Rにはデータフレームと呼ばれる型が存在しますこれもリストの一種で行列と同じ二

次元配列ですデータフレームの各々の行は1つのサンプルに対する観測値各列はサン

プルに対する1つの項目とみなすことができますこれを使うと表を簡単に表現するこ

とができます以下の表は日本プロ野球の5人の元選手の名前在籍チーム名通算打数

安打数本塁打数を表したものです

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

これをデータフレームを使って表すと以下のようになります

x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

データフレームを作り出す関数 dataframeは dataframe(rownames = 列のラベルのベク

トル列名 1 = ベクトル 1列名 2 = ベクトル 2 )の形式で使うことができますxの中

味は以下のようになっていることが分かります

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

通常のリストと同様列名を使って対応するベクトルを抽出することができます

gt x$Hits

[1] 2901 3085 2543 2786 2566

gt

10

データフレームからは任意の部分をさらにデータフレームとして抽出することができ

ます例えば 15行目と 234列目を抽出する場合

x[ c(15) c(234) ]

とします4

データフレームに対してさらに様々な処理が可能ですまずは上記で定義された x にど

のような属性があるのかattributesで調べてみましょう

gt attributes(x)

$names

[1] Team At_Bat Hits Home_Runs

$rownames

[1] Nomura Harimoto Kinugasa Oh Kadota

$class

[1] dataframe

gt

属性としてnames rownames class が出てきましたnames(x)rownames(x)class(x)

と入力してみましょうそれぞれ列名行名xの型が出てくるでしょう

課課題題 77--11 下の表は G8 加盟国の国力の一部ですこれをデータフレームとして変数にしま

しょう5

Area Population GDP

USA 94 315 14

England 02 62 3

Italy 03 60 2

Canada 100 34 2

Germany 03 82 4

Japan 03 127 5

France 05 62 3

Russia 171 141 2

4 x[c(Nomura Kadota)c(At_Bat Hits Home_Runs)]でも同様に

動作する 5 要素が全て数値なので行列として扱うこともできるデータフレームにしてしまった

変数 xに対しては行列演算ができないことがあるのでその場合は asmatrix(x)で行列に

変換する

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 8: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

8

で最後にベクトル(1 2 3)が加わっていますここから2番目の要素を取り出すためには

x[[2]]

とします各々の要素に名前を付けることも可能です

x lt- list(First=Oh Second=Nomura Third=Kadota Home_Runs=c(868 657 567))

として各々の要素に First Second Third Home_Runsという名前が付いていることを確

認しましょう

gt x

$First

[1] Oh

$Second

[1] Nomura

$Third

[1] Kadota

$Home_Runs

[1] 868 657 567

gt

名前を使って個々の要素を取り出すためには(例えば2つ目の要素を取り出すには)

x[[Second]]

または

x$Second

とします

課課題題 66--11 名前が Yamagata のベクトル(ldquoTsuruokardquo ldquoSakatardquo ldquoYonezawardquo)と名前が

Niigataのベクトル(ldquoYuzawardquo ldquoNiitsurdquo ldquoShibatardquo)を要素にしたようなリストを作成しそ

の中味を表示してみましょう

9

7 簡単なデータフレームの作成

Rにはデータフレームと呼ばれる型が存在しますこれもリストの一種で行列と同じ二

次元配列ですデータフレームの各々の行は1つのサンプルに対する観測値各列はサン

プルに対する1つの項目とみなすことができますこれを使うと表を簡単に表現するこ

とができます以下の表は日本プロ野球の5人の元選手の名前在籍チーム名通算打数

安打数本塁打数を表したものです

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

これをデータフレームを使って表すと以下のようになります

x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

データフレームを作り出す関数 dataframeは dataframe(rownames = 列のラベルのベク

トル列名 1 = ベクトル 1列名 2 = ベクトル 2 )の形式で使うことができますxの中

味は以下のようになっていることが分かります

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

通常のリストと同様列名を使って対応するベクトルを抽出することができます

gt x$Hits

[1] 2901 3085 2543 2786 2566

gt

10

データフレームからは任意の部分をさらにデータフレームとして抽出することができ

ます例えば 15行目と 234列目を抽出する場合

x[ c(15) c(234) ]

とします4

データフレームに対してさらに様々な処理が可能ですまずは上記で定義された x にど

のような属性があるのかattributesで調べてみましょう

gt attributes(x)

$names

[1] Team At_Bat Hits Home_Runs

$rownames

[1] Nomura Harimoto Kinugasa Oh Kadota

$class

[1] dataframe

gt

属性としてnames rownames class が出てきましたnames(x)rownames(x)class(x)

と入力してみましょうそれぞれ列名行名xの型が出てくるでしょう

課課題題 77--11 下の表は G8 加盟国の国力の一部ですこれをデータフレームとして変数にしま

しょう5

Area Population GDP

USA 94 315 14

England 02 62 3

Italy 03 60 2

Canada 100 34 2

Germany 03 82 4

Japan 03 127 5

France 05 62 3

Russia 171 141 2

4 x[c(Nomura Kadota)c(At_Bat Hits Home_Runs)]でも同様に

動作する 5 要素が全て数値なので行列として扱うこともできるデータフレームにしてしまった

変数 xに対しては行列演算ができないことがあるのでその場合は asmatrix(x)で行列に

変換する

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 9: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

9

7 簡単なデータフレームの作成

Rにはデータフレームと呼ばれる型が存在しますこれもリストの一種で行列と同じ二

次元配列ですデータフレームの各々の行は1つのサンプルに対する観測値各列はサン

プルに対する1つの項目とみなすことができますこれを使うと表を簡単に表現するこ

とができます以下の表は日本プロ野球の5人の元選手の名前在籍チーム名通算打数

安打数本塁打数を表したものです

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

これをデータフレームを使って表すと以下のようになります

x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

データフレームを作り出す関数 dataframeは dataframe(rownames = 列のラベルのベク

トル列名 1 = ベクトル 1列名 2 = ベクトル 2 )の形式で使うことができますxの中

味は以下のようになっていることが分かります

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

通常のリストと同様列名を使って対応するベクトルを抽出することができます

gt x$Hits

[1] 2901 3085 2543 2786 2566

gt

10

データフレームからは任意の部分をさらにデータフレームとして抽出することができ

ます例えば 15行目と 234列目を抽出する場合

x[ c(15) c(234) ]

とします4

データフレームに対してさらに様々な処理が可能ですまずは上記で定義された x にど

のような属性があるのかattributesで調べてみましょう

gt attributes(x)

$names

[1] Team At_Bat Hits Home_Runs

$rownames

[1] Nomura Harimoto Kinugasa Oh Kadota

$class

[1] dataframe

gt

属性としてnames rownames class が出てきましたnames(x)rownames(x)class(x)

と入力してみましょうそれぞれ列名行名xの型が出てくるでしょう

課課題題 77--11 下の表は G8 加盟国の国力の一部ですこれをデータフレームとして変数にしま

しょう5

Area Population GDP

USA 94 315 14

England 02 62 3

Italy 03 60 2

Canada 100 34 2

Germany 03 82 4

Japan 03 127 5

France 05 62 3

Russia 171 141 2

4 x[c(Nomura Kadota)c(At_Bat Hits Home_Runs)]でも同様に

動作する 5 要素が全て数値なので行列として扱うこともできるデータフレームにしてしまった

変数 xに対しては行列演算ができないことがあるのでその場合は asmatrix(x)で行列に

変換する

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 10: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

10

データフレームからは任意の部分をさらにデータフレームとして抽出することができ

ます例えば 15行目と 234列目を抽出する場合

x[ c(15) c(234) ]

とします4

データフレームに対してさらに様々な処理が可能ですまずは上記で定義された x にど

のような属性があるのかattributesで調べてみましょう

gt attributes(x)

$names

[1] Team At_Bat Hits Home_Runs

$rownames

[1] Nomura Harimoto Kinugasa Oh Kadota

$class

[1] dataframe

gt

属性としてnames rownames class が出てきましたnames(x)rownames(x)class(x)

と入力してみましょうそれぞれ列名行名xの型が出てくるでしょう

課課題題 77--11 下の表は G8 加盟国の国力の一部ですこれをデータフレームとして変数にしま

しょう5

Area Population GDP

USA 94 315 14

England 02 62 3

Italy 03 60 2

Canada 100 34 2

Germany 03 82 4

Japan 03 127 5

France 05 62 3

Russia 171 141 2

4 x[c(Nomura Kadota)c(At_Bat Hits Home_Runs)]でも同様に

動作する 5 要素が全て数値なので行列として扱うこともできるデータフレームにしてしまった

変数 xに対しては行列演算ができないことがあるのでその場合は asmatrix(x)で行列に

変換する

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 11: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

11

課課題題 77--22 上記で作成したデータフレームより G8加盟国の国土面積人口GDPの平均を

それぞれ求めましょう

8 ファイルからの読み込み

これまでは数値データを全て入力していましたしかし数値データはファイルで用意

されることも多いでしょうそこでファイルから数値データを読み込む方法を紹介します

まず以下のような数値データが書かれたファイルを用意しましょう仮にこのファイル

名を testdatatxtディレクトリの位置をUserssaitoTMPとします

14

14

21

35

6

まず setwdによって作業ディレクトリをUserssaitoTMPにします

setwd(UserssaitoTMP)

次に scanコマンドを使ってデータを変数 xに読み込みます

gt x lt- scan(testdatatxt)

Read 5 items

gt x

[1] 14 14 21 35 6

gt

xにファイルの数値がベクトルとして読み込まれているのが分かります

R では表の読み込みを行う関数 readtable が用意されています以下のようなタブ区切

りのファイル batterstxtがあったとします

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

readtableを使うとこれをデータフレームとして読み込むことができます6

6 readtableには様々なオプションがある引数に quote=rdquordquoを指定すると表中の引用符

等に対して特別な扱いをしなくなるchecknames=Fで列ラベル名の自動変換が抑制され

るcommentchar=rdquordquoでコメント記号(ldquordquo)を無効にできる

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 12: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

12

gt x lt- readtable(batterstxt header = T

sep = yent rownames = 1)

gt x

Team At_Bat Hits Home_Runs

Nomura Hawks 10472 2901 657

Harimoto Flyers 9666 3085 504

Kinugasa Carps 9404 2543 504

Oh Giants 9250 2786 868

Kadota Hawks 8868 2566 567

gt

関数の引数の最初でrdquobatterstxtrdquoと読み込むファイル名を指定し次に Team At_Batなど

のヘッダーがあることを header = Tで示しますそして sep = ldquoyentrdquoでタブ区切りであるこ

とを示し7最後に行の名前が1列分あることを rownames = 1で指定します変数 xはデ

ータフレームとなるのでx$Hitsなどで安打数を得ることができます

課課題題 88 課題 7-1の表をタブ区切りファイルとして保存しデータフレームとして読み込ん

でみましょう

9 ファイルへの書き出し

統計処理の結果を一時的に画面で確認するだけでなくファイルに書き出して後で表計

算ソフトや他のプログラムで読み込みたいというケースがあるでしょうファイル出力を

する上で一番簡単なのが write関数でしょうこれを使うと変数に格納された数値をファ

イルに書き出すことができます例えば

x lt- c(10 12 15 19 21 34)

で変数 xにベクトルを代入した後

write(x outfile1txt ncolumns = 1)

とするとxの内容がrdquooutfile1txtrdquoというファイルに書き込まれますncolumns = 1は数

値を 1列で出力することを指定しています

outfile1txtの中味

10

12

15

19

7 処理系によってはは (バックスラッシュ)になるMacintoshではoptionキーを押

しながらキーを押す

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 13: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

13

21

34

write 関数を使うとさらに以下のように行列データもファイルに書き出すことが可能で

gt x lt- matrix(c(123456) nrow=2 ncol=3 byrow=T)

gt x

[1] [2] [3]

[1] 1 2 3

[2] 4 5 6

gt write(t(x) outfile2txt ncolumns=ncol(x) sep=yent)

gt

t(x)で行列 xを転置しないと出力されるファイル中の行列が転置されたものになってしま

うので注意が必要ですncolumns=ncol(x)で出力される列数を行列 xの列数に揃えsep

= ldquoyentrdquoでタブ区切りファイルにすることを指定しています

outfile2txtの中味

1 2 3

4 5 6

データフレームをファイルに出力する関数としてwritetable が用意されていますこれ

はデータフレームの内容をファイルに書き出します

gt x lt- dataframe(

rownames = c(Nomura Harimoto Kinugasa Oh Kadota)

Team = c(Hawks Flyers Carps Giants Hawks)

At_Bat = c(10472 9666 9404 9250 8868)

Hits = c(2901 3085 2543 2786 2566)

Home_Runs = c(657 504 504 868 567))

gt x[c(34)]

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

gt writetable(x[c(34)] outfile3txt sep=yent rownames=T

colnames=NA)

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 14: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

14

gt

rownames=T colnames=NAでそれぞれ行名列名(先頭に空白を挿入)を入れます

outfile3の中味

Hits Home_Runs

Nomura 2901 657

Harimoto 3085 504

Kinugasa 2543 504

Oh 2786 868

Kadota 2566 567

ちなみに quote=Fを指定すると二重引用符を除いた出力になります

課課題題 99 上記データフレームで各バッターに対して打率すなわち Hits At_Batを計算

しその結果をrdquooutfile4txtrdquoに格納しましょう

10 プログラムの読み込み

これまでは変数への代入操作などを全て対話的に行っていましたしかし決まった長い

手続きを何度も入力するのは面倒ですそこで一連の手続きをファイルにしておいてそ

れを必要なときに実行することが可能です例えば以下のような操作を記述したファイ

ルを用意しますファイル名を substtestRとします

x lt- c(12345)

y lt- c(246810)

z lt- x + y

これを以下のように source(ldquosubsttestRrdquo)とするとsubsttestR 中に記述された手続きを

実行することができます結果として x y zそれぞれに値が代入されます

gt source(substtestR)

gt x

[1] 1 2 3 4 5

gt y

[1] 2 4 6 8 10

gt z

[1] 3 6 9 12 15

gt

課課題題 1100 課題 8の手続きを dframetestRというファイルに書き込みsourceを使ってその

手続きを実行してみましょう

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 15: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

15

11 関数の定義

関数は数学的にはある入力に対応した出力を返すものですコンピュータプログラミン

グではまとまった処理の単位を表します8例えば今二つの数を足して 2 で割る関数 f

を考えますこれは数学では f(x y) = (x + y) 2などと記述できますがRでは以下のよう

に functionを使って以下のように記述します

f lt- function(x y)

return ((x + y) 2)

これによって xと yを入力(引数)とする関数 fが定義されますそして出力(返り値)が(x + y)

2となるのですその後

f(10 20)

とすればx に 10y に 20 が代入され15 という答えが返ってくるはずです9このよう

に returnは最終的な返り値を決めます

関数のより一般的な定義の仕方は

関数名 lt- function(引数 1 引数 2 hellip)

引数を使った様々な処理

return(返り値)

です10

課課題題 1111 f(x a b c) = ax2 + bx + cを Rの関数として実装しましょうf(4 3 2 1)はいくつ

になりますか

12 グラフの作成

R では簡単にグラフを作成する関数が用意されていますplot 関数は二次元プロットを

作成することができます例えば以下のように x 座標と y 座標の値をそれぞれベクトルと

して与えると(12) (34) (59) (77) (98)の点にプロットを作成できます

x lt- c(13579)

y lt- c(24978)

plot(x y xlab=X Value ylab=Y Value)

8 サブルーチンという呼び方がより正確 9 f(x=10 y=20)のようにどの引数のどの値を渡すかを明示してもよい 10 追加引数hellipの中味は list(hellip)でリストとして閲覧することが可能

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 16: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

16

xlab ylabでそれぞれ x軸y軸のラベルを指定しています

2 4 6 8

23

45

67

89

X Value

YV

alu

e

作成されたプロット

barplotを使うと棒グラフを作成することができます以下の例では各棒の高さに対

応させるベクトルおよびそのラベルを変数 xに与えbarplot(x)を呼び出しています

x lt- c(1232101)

names(x) lt- c(A B C D E F)

barplot(x)

A B C D E F

02

46

810

A B C D E F

02

46

810

作成された棒グラフ

histはベクトルで与えられた数値群のヒストグラムを作成する関数です

x lt- c(32 12 42 23 34 59 52 53 41 52 32 14)

hist(x xlab = Test Value main = Test Histogram)

mainによってヒストグラムのタイトルを指定しています

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 17: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

17

Test Histogram

Test Value

Fre

qu

en

cy

1 2 3 4 5 6

01

23

4

作成されたヒストグラム

boxplotは複数のベクトル中に含まれる値の分布を表す箱ひげ図を作成します

x1 lt- c(1112111011111213151211101213)

x2 lt- c(20212791223231211921157121292315)

boxplot(x1 x2 names=c(Data 1 Data 2))

外れ値

中央値

この範囲に50のデータが分布する

外れ値を除く上位25

外れ値を除く下位25

作成された箱ひげ図

課課題題 1122 課題 7-1 で与えられた表に関して国土面積と人口の関係をプロットしてみまし

ょう

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 18: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

18

13 基本的なプログラミングの構文

R には他のプログラミングにも存在するような基本的なプログラミングの構文も用意さ

れていますここではそれらについてかいつまんで簡単に説明します

131 if文

if文は与えられた条件11が成立するときのみ与えられた手続きを実行する構文です例

えば x gt 0のときに yを 1にするそれ以外は yを 0にするという手続きは

if (x gt 0)

y lt- 1

else

y lt- 0

としますx = -5にした後上記を実行しyの値を調べてみましょう次に x = 3にした後

上記を実行しyの値を調べましょう

if文のより一般的な形式は以下の通りです

if (条件 1)

条件 1が成立したときの手続き

else if (条件 2)

条件 1が不成立条件 2が成立したときの手続き

else if(条件 3)

条件 2までが不成立条件 3が成立したときの手続き

else if hellip

else

上記どの条件も成立しなかったときの手続き

課課題題 1133--11 入力が 0のときに 1それ以外では 0を返す関数 dを定義しましょう

132 while文

while 文は与えられた条件が成立している間与えられた手続きを繰り返す構文です

while文の形式は

11 条件文にはamp(論理積)や|(論理和)などの論理演算子が使える

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 19: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

19

while(条件)

条件が成立しているとき実行する手続き

です12例えば x lt- 1とした後while (x lt= 3) print(x) x lt- x + 1 とすれば1から 3ま

でが出力されます

gt x lt- 1

gt while (x lt= 3) print(x) x lt- x + 1

[1] 1

[1] 2

[1] 3

gt

プログラムとしてファイルに記述するときは次のように一行一文にした方が見やすい

でしょう

x lt- 1

while (x lt= 3)

print(x)

x lt- x + 1

最初に while 文に入ったときx は 1 なのでwhile 文の中の手続きである print(x)(x

の値を表示する)が実行され1が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が

実行されますwhile文の最後で xの値は 2になっています

次の while 文の条件判定においてx は 2 で 3 以下なのでwhile 文の中の手続きであ

る print(x)が実行され2が表示されるとともに x lt- x + 1 (xの値を 1つ増やす)が実行さ

れますwhile文の最後で xの値は 3になっています

その次の while 文の条件判定においてx は 3 で 3 以下なのでwhile 文の中の手続き

である print(x)が実行され今回は 3が表示されるとともに x lt- x + 1 (xの値を 1つ増や

12 while文の次の繰り返しを強制的に行う nextwhile文から強制的に抜ける break文な

ども用意されている

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 20: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

20

す)が実行されますwhile文の最後で xの値は 4になっています

その次の while文の条件判定で xは 4で 3以下ではないので条件に合わずwhile文

から抜けます

課課題題 1133--22 while文を使って1357911を1行ずつ表示しましょう

133 for文

for 文も while 文と同じ繰り返しですがfor 文では与えられた要素群の中の要素1つ1

つを変数に1回ずつ代入しながら繰り返し処理を行いますその形式は

for(変数 in 要素群)

手続き

です例えばfor (i in c(135)) print(i) で135が手続き中で使われている変数 iに毎

回代入されそれが出力されますfor (i in 15)) print(i) なら1から 5までが変数 iに代

入されそれが出力されるでしょうまた以下の例は1から 5までの二乗をベクトルにし

ます13

x lt- NULL

for (i in 15)

x lt- append(x i2)

x lt- NULLで空のベクトルを xに代入しますNULLは空を意味します

for文で iに 1から 5までが順次代入され代入の度に for文の中が実行されます

for文の中で iの二乗(i2)がベクトル xに追加されますappend(x i)はベクトル xに i

を追加する関数です14

課課題題 1133--33 課題 12-2を for文を使って書き直しましょう

13 実は for文を使わなくてもx lt- (15)2で同じことができる 14 x lt- c(x i2)でも良いcはベクトルの連結にも使うことができる

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数

Page 21: 初心者用 - Trey Ideker Laboratorychianti.ucsd.edu/~rsaito/ENTRY1/WEB_RS3/PDF/JPN/Texts/R...7 [1] 2.5 3.5 4.5 行列は2 次元の数値の羅列ですが、R ではarray(ベクトル、各次元の要素の個数)を使っ

21

14 その他のコマンドや関数

Rでよく使う関数をいくつか挙げておきましょう

141 使い方

help(関数)で関数の詳しい使い方が表示されます

142 変数と属性

ls()または objects()で現在定義されている変数が表示されます

class(変数)または mode(変数)でオブジェクトの型(例えば変数が数値なのか文字なの

かリストなのか行列かなど)を知ることができます

attributes(変数)で定義されている属性がリストで返ってきます

143 apply系関数

apply を使うと行列の各行または各列に対して同じ処理を繰り返し結果をベクトル

で受け取ることができます(5 簡単な行列の作成と演算参照)

sapply を使うとベクトルの要素 1 つ 1 つを与えられた関数に入力し出力結果を 1

つ 1つ含んだベクトルとして得ることができます

func1_sub lt- function(elm) スカラーelemに対する関数の定義

if(-1 lt= elm amp elm lt= 1) return (1) else return (0)

func1 lt- function(x) ベクトル xを入力とする関数

return(sapply(x func1_sub))

144 図の作成

curve関数で関数のグラフを作成できます詳しくは helpを参照して下さい

curve(dnorm -7 +7) 正規分布の描画

curve(cos(x)+cos(2x) -2pi 2pi 1000) 1000はプロット数

curve(func1 -3 3) 143 apply系関数で定義した関数