プログラミング演習

プログラミング演習
第4回
本日の講義内容
・ プログラムの作成
・ 条件分岐
・ データフレーム
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりダウンロード
本日の講義内容
・ プログラムの作成
・ 条件分岐
・ データフレーム
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりダウンロード
関数の戻り値は数値だけでなく、ベクトルや行列も
戻り値にできる
mkMtx <- function(x, y) {
len <- length(y)
z <- matrix(c(x, y), ncol=len, byrow=T)
return (z)
}
引数x, yは同じ次元のベクトルとする。
戻り値 z は、xを一行目、yを二行目とした行列
ncolは行列の列数を指定。これをx, yの次元数にとっている
byrow=Tで, 行方向にベクトルの要素を埋めて行列を作成
することを指定 > source("Z:mkMatrix.R")
> mkMtx(a,b)
[,1] [,2] [,3]
[1,]
1
-2
3
[2,]
-3
2
1
> a
[1] 1 -2 3
> b
[1] -3 2 1
> mkMtx(a,b)
[,1] [,2] [,3]
[1,]
1
-2
3
[2,]
-3
2
1
> a
[1] 1 -2 3
> b
[1] -3 2 1
> mkMtx(m, n)
[,1] [,2] [,3] [,4]
[1,] 1.0 2.3 1.4 1.6
[2,] 6.7 8.8 1.1 9.9
> m
[1] 1.0 2.3 1.4 1.6
> n
[1] 6.7 8.8 1.1 9.9
> mkMtx(x, y)
[,1] [,2] [,3] [,4] [,5]
[1,] 9.0 9.0 8.0 1.0 5.0
[2,] 3.3 3.3 5.1 2.2 3.3
> x
[1] 9 9 8 1 5
> y
[1] 3.3 3.3 5.1 2.2 3.3
関数の引数としてファイル名を与えることもできる
行列データの入っているファイル名を引数として与え
行列の1行1列、2行2列、3行3列を要素とする
3次元ベクトルを戻り値として返すプログラムを作成
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりmkVector.R をダウンロードし、ドキュメントdirectory
(Zドライブ)におく
mkVector.Rの内容
mkVc <- function(filename) {
mtx <- read.table(filename)
vc <- c(mtx[1,1], mtx[2,2], mtx[3,3])
return (vc)
}
> source(”Z:mkVector.R")
> mkVc("matrix1.txt")
[1] 2 9 2
変数 filenameに”mkVector.R”というファイル名を文字列として代入
本日の講義内容
・ プログラムの作成
・ 条件分岐
・ データフレーム
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりダウンロード
条件分岐
if (条件) {
条件が真(TRUE)の時の処理
}
else {
条件が偽(FALSE)の時の処理
}
条件の書き方
x == y
x < y
x <= y
x > y
x >= y
x != y
一致
xがyより小
xがy以下
xがyより大
xがy以上
xはyと異なる
== と != は数値だけでなく、文字列についても使える
forループや今回学ぶ条件分岐など、複数行にわたる
スクリプトを書く場合、メモ帳やこれから説明する
Rの エディタに一旦書いて、それをRのコンソールに
コピペすると良い。
間違っていても修正が簡単
x <- c(120,10,34,909,21,3,67,221,87,112)
len <- length(x)
for ( i in 1:len) {
if (x[i] > 100) {
print(i)
}
else {
print("****")
}
}
ベクトル xの要素が100より大なら
i を出力
さもなければ **** を出力
[1]
[1]
[1]
[1]
[1]
[1]
[1]
[1]
[1]
[1]
> 1
"****"
"****"
4
"****"
"****"
"****"
8
"****"
10
複数の条件を組み合わせる
条件1 && 条件2
条件1も条件2の真であれば真
その他は、偽
条件1 || 条件2
条件1か条件2のいずれかが真であれば真
両方が偽の時に偽
2条件だけでなく
(条件1 && 条件2) || 条件3
などのように複数の条件を組み合わせて利用できる
問題2
x <- c(120,10,34,909,21,3,67,221,87,112)
len <- length(x)
for (i in 1:len) {
if ( ) {
print(x[i])
}
else {
print(i)
}
}
x[i] は偶数か、x[i]が10以上70以下
}
という条件はどうなるか?
偶数であること => 2で割った余りが0
本日の講義内容
・ プログラムの作成
・ 条件分岐
・ データフレーム
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりダウンロード
データ型
> typeof("a")
[1] "character”
> typeof("abcd")
[1] "character"
> typeof(1)
[1] "double"
> typeof(1.33)
[1] "double"
> x <- 1
> typeof(x)
[1] "double"
> x <- "ABC"
> typeof(x)
[1] "character"
Rで使用される変数など
(正確にはオブジェクト)
は、ある特定の型を持つ
代表的なものとして
左に示す文字列
(character)や実数
(double)がある。
行列は1種類の型のみで構成される表形式のデータ
> x <- matrix(c(1,5,9,2),ncol=2)
> typeof(x)
[1] "double”
> x <- matrix(c("a","b","c","d","ef","gde"), ncol=3)
> typeof(x)
[1] "character”
> x
[,1] [,2] [,3]
[1,] "a" "c" "ef"
[2,] "b" "d" "gde"
行列で数字と文字を混在させると、自動的に数字は文字型に
される
> x <- matrix(c("a","b","c","d",1,2), ncol=3)
> x
[,1] [,2] [,3]
[1,] "a" "c" "1"
行列では文字型として
[2,] "b" "d" "2"
扱われる
> typeof(x)
[1] "character"
行列は1種類のデータ型のみで構成される!!
------à 複数のデータ型を混在させることのできる表形式
のデータをRではデータフレームとよぶ
sampleR5.txtに以下のデータが格納されている
1.95
1.55
1.45
2.01
2.13
1.54
1.98
1.47
1.34
1.36
2.23
3.3
2.1
2.2
3.4
3.0
1.9
2.9
1.8
1.7
1.8
3.1
RED
YELLOW
YELLOW
RED
RED
YELLOW
RED
YELLOW
YELLOW
YELLOW
RED
ダウンロードしてZドライブ(ドキュメンタリフォルダー)におく
データフレームも行列同様,read.tableでファイルから読める
> x <- read.table(”Z:sample5.txt")
> x
V1 V2
V3
1 1.95 3.3
RED
データフレームの
2 1.55 2.1 YELLOW
データ型はlistである。
3 1.45 2.2 YELLOW
4 2.01 3.4
RED
5 2.13 3.0
RED
ある植物の
6 1.54 1.9 YELLOW
1列目:丈(m)
7 1.98 2.9
RED
2列目:葉の平均サイズ(cm)
8 1.47 1.8 YELLOW
3列目:花の色
9 1.34 1.7 YELLOW
10 1.36 1.8 YELLOW
11 2.23 3.1
RED
各行は異なる個体
> typeof(x)
[1] "list"
データフレームも行列と同様に添字で要素を指定して
参照できる
> x[1,]
V1 V2 V3
1 1.95 3.3 RED
> x[,3]
[1] RED YELLOW YELLOW RED RED YELLOW RED YELLOW YELLOW YELLO
[11] RED
Levels: RED YELLOW
> x[1,3]
[1] RED
Levels: RED YELLOW
> x[3,2]
[1] 2.2
関数 lengthも行列同様に使えるが、返す値が異なる点に注意
> length(x)
[1] 3
> length(x[1,])
[1] 3
> length(x[,1])
[1] 11
行列の場合length(x)が返すのは、xの全要素の数であったが
データフレームの場合は、列の数になる
次ページに示すプログラムは、sample5.txtと同様の形式の
ファイルを読み込んで、黄色の花を持つ個体の丈の平均値を
返す関数である。? の部分を埋めて完成させて、sample5.txt
の黄色の花を持つ個体の丈の平均値を求めなさい。
このファイルは、ymh.Rとしてダウンロードできるが、
自分でメモ帳やRのエディタで作成しても良い。
ymh <- function(filename) {
x <- read.table( ? )
size <- length( ? )
m <- 0
n <- 0
データフレームの行数
for (i in 1: ? ) {
if ( ? == "YELLOW") {
n <- n + 1
m <- m + x[i,1]
}
}
return ( ? )
文字列の比較
}
平均値
コンソールからの完成したプログラムの読み込みと
実行
> source(”Z:ymh.R")
> ymh(”Z:sample5.txt")
ファイル名を与えて実行
ファイルからのプログラム
の読み込み。
これでこのセッションで
自作関数 ymh を使用
できる
Rによるプログラムの作成の復習
セルフチェック
(1) R を起動する。
(2) Rのファイルメニューから、エディターを開いて
新規スクリプトの作成を開始
いずれもこれまでの資料にあるが、自分でできるかを確認
エディターに次のスクリプトを書き込み、前回の資料の最後に
出て来た自作関数ymhを各ステップを確認しながら完成させる。
※ 書き込むのはコンソール画面ではない。
(コンソールとエディターの区別はついているか?)
ymh は、 sample5.txt中、黄色の花の丈の平均値
を求める関数
(1) 第一ステップ
sample5.txtの内容をデータフレームとしてxに読み込み、
xの内容をコンソール画面に出力する関数を作ってみよう
ymh
<- function()
{
x <- read.table(“Z:sample5.txt”)
print(x)
}
sample5.txtに以下のデータが格納されている
1.95
1.55
1.45
2.01
2.13
1.54
1.98
1.47
1.34
1.36
2.23
3.3
2.1
2.2
3.4
3.0
1.9
2.9
1.8
1.7
1.8
3.1
RED
YELLOW
YELLOW
RED
RED
YELLOW
RED
YELLOW
YELLOW
YELLOW
RED
※ 前回、sampleR5.txtとなっていたのは、sample5.txtの間違いです
書き込みの際の注意
日本語モードになっていないか?
英数字モードにして入力すること
セルフチェック
(1)書き込めたら、ファイルを保存 (ファイルメニューから)
保存するフォルダーは、ドキュメントフォルダ(Zドライブ)
ファイル名は拡張子 Rをつけること (ex. ymh.R)
(2) source で自作関数を読み込み実行
> source(”Z:ymh.R")
> ymh()
V1 V2
V3
1 1.95 3.3
RED
2 1.55 2.1 YELLOW
3 1.45 2.2 YELLOW
4 2.01 3.4
RED
5 2.13 3.0
RED
6 1.54 1.9 YELLOW
7 1.98 2.9
RED
8 1.47 1.8 YELLOW
9 1.34 1.7 YELLOW
10 1.36 1.8 YELLOW
11 2.23 3.1
RED
(2) 第ニステップ
第一ステップで作成した関数を編集して, データ
フレームxの1列目(=丈の高さ)を各行ごとに
出力する関数を作成する。
ymh <- function() {
x <- read.table(”Z:sample5.txt")
len <- length(x[,1])
for (i in 1:len) {
print(x[i, 1])
}
}
データフレーム x
1.95
1.55
1.45
2.01
2.13
1.54
1.98
1.47
1.34
1.36
2.23
3.3
2.1
2.2
3.4
3.0
1.9
2.9
1.8
1.7
1.8
3.1
x[,1]
x[,2]
RED
YELLOW
YELLOW
RED
RED
YELLOW
RED
YELLOW
YELLOW
YELLOW
RED
x[,3]
それぞれ、xの1列、2列、3列をベクトルとして抽出
データフレーム x
1.95
1.55
1.45
2.01
2.13
1.54
1.98
1.47
1.34
1.36
2.23
3.3
2.1
2.2
3.4
3.0
1.9
2.9
1.8
1.7
1.8
3.1
RED
YELLOW
YELLOW
RED
RED
YELLOW
RED
YELLOW
YELLOW
YELLOW
RED
x[1,]
x[5,]
x[11,]
xの1行、5行、11行をベクトルとして抽出
データフレーム x
1.95
1.55
1.45
2.01
2.13
1.54
1.98
1.47
1.34
1.36
2.23
x[1,1]
3.3
2.1
2.2
3.4
3.0
1.9
2.9
1.8
1.7
1.8
3.1
RED
YELLOW
YELLOW
RED
RED
YELLOW
RED
YELLOW
YELLOW
YELLOW
RED
x[11,2]
添字でxの要素を添字を指定して抽出
x[5,3]
ymh <- function() {
x <- read.table(”Z:sample5.txt")
len <- length(x[,1])
for (i in 1:len) {
print(x[i, 1])
}
}
変数lenは、別にlenである必要はない
後で変数の意味がわかりやすいように
名前を決定しておくとよい
length関数の意味は?
保存
sourceで読み込み
実行
> source(”Z:ymh.R")
> ymh()
[1] 1.95
[1] 1.55
[1] 1.45
データフレームの1列目だけが
[1] 2.01
各行ごとに出力している
[1] 2.13
[1] 1.54
[1] 1.98
[1] 1.47
[1] 1.34
[1] 1.36
[1] 2.23
(3) ステップ3
ステップ2で作成したスクリプトを編集して
花の色が黄色の時だけ、丈の高さを出力するようにする
ymh <- function() {
x <- read.table(”Z:sample5.txt")
len <- length(x[,1])
for (i in 1:len) {
if (x[i, 3] == "YELLOW")
print(x[i, 1])
}
}
{
}
if文 についての注意
条件が成立しなかった場合は、else以下にその場合の
処理を書くが、特に処理がなければ省略できる。 ファイルを保存後、sourceで読み込んで実行
> source("ymh.R")
> ymh()
[1] 1.55
[1] 1.45
[1] 1.54
[1] 1.47
[1] 1.34
[1] 1.36
条件分岐
if (条件) {
条件が真(TRUE)の時の処理
}
else {
条件が偽(FALSE)の時の処理
}
条件の書き方
x == y
x < y
x <= y
x > y
x >= y
x != y
一致
xがyより小
xがy以下
xがyより大
xがy以上
xはyと異なる
== と != は数値だけでなく、文字列についても使える
複数の条件を組み合わせる
条件1 && 条件2
条件1も条件2の真であれば真
その他は、偽
条件1 || 条件2
条件1か条件2のいずれかが真であれば真
両方が偽の時に偽
2条件だけでなく
(条件1 && 条件2) || 条件3
などのように複数の条件を組み合わせて利用できる
(4) ステップ4
ステップ3で作成した関数を編集して、黄色の花について
丈の高さの平均値を求める関数を作る。
ymh <- function() {
x <- read.table(”Z:sample5.txt")
len <- length(x[,1])
j <- 0
k <- 0
for (i in 1:len) {
if (x[i, 3] == "YELLOW")
j <- j + x[i,1]
k <- k + 1
}
}
{
return(j/k)
}
jは丈の高さの総和を、kは黄色の花の個体数をカウントしている。
ファイルを保存後、sourceで読み込んで実行
> source(”Z:ymh.R")
> ymh()
[1] 1.451667