Rを使ったプログラミング演習 †前回から使いはじめたRというソフトウェア。コマンドを入力するのはちょと難しいけど、エクセルみたいにマウスを使って面倒な操作をしなくても、一瞬にして統計解析をやってくれるし、グラフも簡単に描けてしまう優れもの。これなら、レポートや卒論のために、何度も解析をやりなおして、グラフを描き直すという作業も面倒ではないだろう。 初めて使ったソフトなのに、受講生の皆さんは、すでにRの操作には慣れてきているし(全員、課題ができていた)、興味も感じているよう。そこで、今回はRを使ったプログラミングに挑戦する。 第9回授業の獲得目標: †
演習:今日の正規表現: データ整形 †以下、これまでに習った正規表現を使って、データを整形してエクセルで集計可能な形にしてください。今回は後方参照は必要ありません。 前回課題2 †* 1:30 * 2:28 * 1:30 * 2:18 * 1:34 * 2:30 * 1:31 * 2:28 * 1:18 * 2:31 * 1:34 * 2:18 * 1:18 * 2:30 * 1:34 * 2:30 * 1:31 * 2:28 * 1:34 * 2:30 * 1:34 * 2:16 * 1:28 * 2:16 * 1:30 * 2:28 * 1:30 * 2:18 * 1:30 * 2:19 * 1:18 * 2:11 * 1:31 * 2:28 * 1:28 * 2:30 * 1:30 * 2:31 * 1:18 * 2:30 * 1:28 * 2:34 * 1:30 * 2:31 * 1:22 * 2:31 * 1:28 * 2:32 * 1: 28 * 2: 30 * 1:34 * 2:18 * 1:34 * 2:28 * 1:30 * 2:28 * 1:23 * 2:34 * 1:30 * 2:18 * 1:18 * 2:17 * 1:30番の葉緑体 * 2:15番の葉緑体 * 1:28 * 2:24 * 1:30 * 2:31 前回課題で皆さんにやってもらった評価を集計してみよう。 手順
前回課題3 : Ozawa-kenによるタイピング技能測定結果 †C B B B C A B B A+++ B S C A+ B G B B C B C C A C C B B C G B A+++ B C C C 集計の手順
なお、タイピングに苦手意識が無くなれば、コンピュータへの苦手意識も減少するので、今後もぜひ練習をつづけるように。 仮説検定:補足 †前回アンケートで、仮説検定について「帰無仮説や有意水準などが分からない。」、「Rの操作は分かったけど、その意味が分からない」という意見があります。でも、私は、今の段階では、 全員がRを使って仮説検定の操作を行うことができただけで十分! と考えています。生物学では収集したデータをもとに何らかの判断を下す場合、ほとんどの場合仮説検定が必要になります。これは別に系統学や生態学に限ったことではありません。最新号のNatureに載っている染色体不安定性を示すマウスの腫瘍に関する論文でもt検定が使われています。
プログラミングって何? †プログラミングっていったい何をすることだろうか?IT用語辞典で調べてみると、、、 載っていない 唯一近いところでは、「プログラミング言語」というのがある。IT用語辞典の説明文からプログラミングに関わるところを抜き出して、「プログラミング」の説明文を作ってみると、
つまり、プログラミングとは、簡単に言うと、「言葉を使ってコンピュータが理解できる命令を作ること」。 今日使うRは統計解析ソフトでもあるけれど、インタプリタ型のプログラミング言語でもある。 コンピュータにどんな命令ができるのか? or どんな命令がしたいか? † 「Wordを立ち上げて文章を作成し、印刷する」とか、「Excelで家計簿を管理する」とかは、市販のソフトウェアを使った作業。いずれも、非常に高度で複雑な命令が、使用者からコンピュータに向かって発せられている。例えば、 でも、本当に市販のソフトウェアを使うだけでいいのだろうか?良くないという点が、すぐに2つ思く: 1. 自分の目的にあったソフトウェアがいつも存在するというわけではない 2. ソフトが存在する場合、目的の数だけ、ソフトの使い方を覚えなければならない 特に1番目は致命的。生物学の研究で、何かの処理をしたいと考えたとき、誰かがソフトウェアを作ってくれていないと目的が達成できないということになってしまう。例えば、今日の授業で話に出てくる「遺伝的浮動」の解析ソフトなんていうのは、パソコンショップに行っても売っていない。 そこで、この授業で次の3つを目的としてプログラミングを勉強する。
実を言うと、生物学の研究者でも、プログラミングなどを経験したことの無い人は大勢いる。今や、DNAシーケンスの決定や整列、系統樹作成にだって、専用のソフトウェアがある。。。しかし、そういうソフトウェアも、多くの場合は研究者自身が作成したもの(学生が作ったものもたくさんある)。この授業では、頭の柔らかい1年生のうちにプログラミングについての動機付けを行うことで、このクラスの中から将来は新しいソフトウェアを開発できる人が出ることも期待している。。 初めて(?)のプログラミング:"Hello World!" †「Hello World!」だなんて、なんか変なタイトル。誰が使い始めたのかは知らないが、多くのプログラミング言語の教科書で、最初に出てくるのがこのプログラム(プログラムを勉強したことのある人なら、誰でも知っている)。では、早速やってみよう。Rを立ち上げて、次のように入力。 print("Hello World!") うまくご挨拶できただろうか? ここでやったのは、print()という関数<注:命令とほとんど同じ意味>を使って"Hello World!"と画面に表示させただけだが、これも 画面にHello Worldと表示させる ということを目的とした立派なプログラムだ。 「えっ?それなら、Rの最初の授業でやったオブジェクトの内容を画面に出すのもプログラミング?」と聞かれるかもしれませんが、その通り。次の囲みの中を全てコピーして、Rのコンソールにペーストしてみよう。 x=c(1,2,3,4,5,6,7,8,9,10) sum(x) 上でやったプログラミングは、 画面に1から10までの整数の合計を表示させる というもの。先週やったRを使った操作も、何らかの処理の結果を画面に表示させるプログラミングだったわけだ。なんとなく、プログラミングが身近になっただろうか? 複数行の命令文 †上でやった2つのプログラミングは、見比べてみると違いがある。"Hello World!"の方は1行だけの命令だが、sumの方は2行になっている。プログラムは通常、いろんな処理を組み合わせて作るので、複数行になることが多い。 q=c(10,15,20,25,30,35,40,45,50,55,60,65,70,80,100) y=c(2,3,4,5,6,7,8,9,10,11,10,11,9,10,12) plot(log10(q^2), log10(y)) このプログラムは、 2つの数値ベクトルについて計算を行って、対数グラフを描く というものだ。使ったデータは、昨年の生物学科1年生がコドラート調査でとったデータで、面積が広くなると種数がどう増えるかを示したものだ。 Rで使う命令 †授業では一つ一つ解説するが、復習課題をやるときとか、自分で新たな解析に挑戦するときは、どういう命令があるかが書かれた説明書が必要になる。前回も紹介したが、
プログラミングの基礎: 繰り返しと代入と条件分岐 †上の例で、紹介したプログラムは、個々の命令を順番に並べて、一度にペーストしただけだった。こんなことなら、Rに命令を1行ずつ与えるのと、ぜんぜん変わらない。そこで、もっとプログラムらしい命令をRに与えてみよう。それは、繰り返しと代入と条件分岐というもので、プログラミングの基本中の基本。 繰り返し †人が不得意でコンピュータが得意なことの一つは、単純な繰り返し作業を際限なく(文句も言わずに)行うことだろう。つまり、プログラミングの一つの目的は、面倒な繰り返し計算をコンピュータにやらせることだと言っても言い過ぎではない。では、何回繰り返すかという命令をどうやってコンピュータに与えるかというと、 for という命令を使う。
なお、1:10 は 1 2 3 4 5 6 7 8 9 10 という数字の集まりを示す。次の囲みの中を1行ずつRに実行させてみよう。 1:10 x=c(1:10) x 練習問題: 2から18までの偶数を全て表示させるプログラムをfor命令を使って作りなさい
解答例:(穴埋め形式) for(i in _:_){ # _ のところには数字が入る print(i*_) } 代入 †上の for(i in 1:10) { print(i) } というプログラムでは、iの値は繰り返しの度に違う値になる。 1回目 iの値は1 2回目 iの値は2 3回目 iの値は3 .... ........ 10回目 iの値は10 では、一つ前の回のiの値を使いたい場合はどうすれば良いだろうか?例えば、1から10までの合計をfor命令を使って計算することを考えると、 現在のiの値に、1つ前のiの値の合計を加えて表示させたい 1回目 iの値は1 1つ前までの合計は0 1 を表示 2回目 iの値は2 1つ前までの合計は1 3 を表示 3回目 iの値は3 1つ前までの合計は3 6 を表示 .... ........ 10回目 iの値は10 1つ前までの合計は45 55 を表示 こういう場合に、代入という命令を使う。代入は、前回すでにオブジェクトへの数値やベクトルの代入で学んだように、 = を使う。我々が通常行う計算では、'='は「3+5=8」というように、「左辺の計算結果が右辺に等しくなる」というる意味で用いられるが、プログラミングにおいては、 左辺の変数に右辺の計算結果を代入する という意味で用いられる。上の合計の計算プログラムは次のようになる。 goukei=0 #goukeiという変数に初期値0を代入 for(i in 1:10) { #以下を10回繰り返す goukei=goukei+i #goukeiに前回までのgoukeiの値にiの値を足したもの代入 print(goukei) #goukeiの内容を画面に表示 } では、上の囲みの中をRに実行させてみよう。 上の命令の中には2箇所、代入が使われている。最初の行では、goukeiという変数に0を代入するという単純なもので、goukeiの初期値を決めている。 次の、goukei=goukei+iという命令文では、右辺の「goukei+i」を先に計算して左辺の「goukei」に代入している。 今の goukei の値に 1 を加えたものを、goukei に代入する(これまでのgoukeiは上書きされる) という意味だ。 練習問題: 1から10までの数字を1つずつ順々にかけ合わせたた結果を全て表示させるプログラムを作りなさい (1x1=1, 1x2=2, 2x3=6, 6x4=24, 24x5=...... と計算してゆくということ) 以下、穴埋め形式でヒントを書いておく。_の部分(1文字とは限らない)を補ってプログラムを完成しなさい。 seki=_ #sekiという変数に初期値1を代入(かけ算だから) for(i in 1:10) { #以下を10回繰り返す _=_*_ #sekiに前回までのsekiの値にiの値を掛けたもの代入 print(seki) #sekiの内容を画面に表示 } うまくできただろうか? 縦に長くプリントされるのは格好悪いので、毎回の計算結果をオブジェクトにベクトルとして代入してから表示させてみよう。 seki=1 #sekiという変数に初期値1を代入 kekka=c() #kekkaというオブジェクトに空ベクトルを初期値として代入 for(i in 1:10) { #以下を10回繰り返す seki=seki*i #sekiに前回までのsekiの値にiの値を掛けたもの代入 kekka=c(kekka,seki) #kekkaというベクトルにsekiの値を要素として追加 } print(kekka) #kekkaの内容を画面に表示 ここでは、計算結果を順々に保存しておく入れ物を、kekkaという名前で作成し、初期値に空ベクトル(データは無いが、ベクトル)を作っている。ベクトルの作成は、前回の授業でやったように c() という関数を使う。 また、ベクトルに要素を追加するにも、同じ関数 c() を使っている。 では、上の囲みの中をRに実行させてみよう。
matrix()という関数はベクトルを行列に変換する働きがある。例えば、 x=c(1, 2, 3, 4, 5, 6, 7, 8, 9) というベクトルを、3 x 3の行列に変換したいときは、 matrix(x, nrow=3, ncol=3) #nrow= は行の数、 ncol= は列の数を指定 matrix(x, 3, 3) #nrow=, ncol=を省略して、こういう書き方もできる #演習:九九の表をmatrixという関数を使って表示さなさい。_を埋めなさい result=c() #resultに空ベクトルを初期値として代入 for(i in 1:9) { #iの値を1から9まで1ずつ変化させる for(j in 1:9){ #jの値を1から9まで1ずつ変化させる result=c(_, _*_) #iとjを掛けたものをresultの要素として追加 } } print(result) print(matrix(result, nrow=i, ncol=j)) #iとjはそれぞれ9で終わっているので、9x9のマスになる 第10回授業の課題 †
課題1.意見調査 †
課題2:Rによるプログラミング:繰り返しと条件分岐 †次の問題文の指定にあるプログラムを作成しなさい。作成したプログラムは課題提出ページに貼り付けなさい。
行頭には必ず半角の空白を入れること(K2Editorで正規表現検索・置換を行えば可能です)。 runif(1) を使いなさい。
|