[1] 6

プログラミング演習
第二回
本日の講義内容
・ ベクトルと行列
・ ファイルからの行列の読み込み
・ 繰り返し処理
・ プログラムの作成
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりダウンロード
本日の講義内容
・ ベクトルと行列
・ ファイルからの行列の読み込み
・ 繰り返し処理
・ プログラムの作成
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりダウンロード
数値の列の形のデータ
x y z
座標 (1.0, 2.3, 5.4)
薬を投与してから一定時間おきの遺伝子Aの発現量
時間 1
2
3 4 5
6 7 (hr)
発現量 (2.0, 32.4, 15.1, 3.0, 2.5, 1.9, 2.3)
対照実験として薬を投与しなかった場合
時間 1
2
3 4 5
6 7 (hr)
発現量 (2.2, 2.4, 1.8, 2.3, 2.5, 1.7, 2.2)
このような数値列は、Rではベクトルとして表現
ベクトル(vector)
c(),seq以外の方法
> 1:50
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
[25] 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
[49] 49 50
> > rep(3, 12)
# 3を12回繰り返す
[1] 3 3 3 3 3 3 3 3 3 3 3 3
>
> rep(c(5,7), 2)
# 5と7を2回繰り返す
[1] 5 7 5 7
>
> rep(3:5, 1:3)
# 3を1回、4を2回、5を3回繰り返す
[1] 3 4 4 5 5 5
>
> x <- 1:50
> x
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
[42] 42 43 44 45 46 47 48 49 50
> x <- seq(1,50)
> x
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
[42] 42 43 44 45 46 47 48 49 50
20 21 22 23 24
44 45 46 47 48
20 21 22 23 24
20 21 22 23 24
> x <- c(2,4.5,1.9,1.1,3.3)
> x
[1] 2.0 4.5 1.9 1.1 3.3
> y <- c(4.1,5.5, 1,2.1,2.2)
> y
[1] 4.1 5.5 1.0 2.1 2.2
> length(x) ベクトルのサイズ
[1] 5
> length(y)
[1] 5
> z <- 5*x ベクトルの実数倍
> z
[1] 10.0 22.5 9.5 5.5 16.5
> x %*% y
ベクトルの内積
[,1]
[1,] 44.42
> x[1]
ベクトルxの要素1を参照
[1] 2
> y[2] ベクトルyの要素1を参照
[1] 5.5
> x[1]*y[1]+x[2]*y[2]+x[3]*y[3]+x[4]*y[4]+x[5]*y[5]
[1] 44.42
> w <- x*y ベクトルの積
> w
[1] 8.20 24.75 1.90 2.31 7.26
> x[1]*y[1]
[1] 8.2
> x[5]*y[5]
[1] 7.26
> sum(x*y) ベクトルの和 ß-- xとyの内積と同じ
[1] 44.42
> sum(x)
[1] 12.8
> sum(y)
[1] 14.9
> x <- c(2,9,1,4,3,6,7,8,4,5,2)
> length(x)
[1] 11
> rev(x)
ベクトルの反転
[1] 2 5 4 8 7 6 3 4 1 9 2
> x[c(3:5)] ベクトルの要素3から要素5を取り出したベクトル
[1] 1 4 3
> x[c(2,5,10)] ベクトルの要素2,5,10を取り出したベクトル
[1] 9 3 5
> x[-c(2,5,10)] ベクトルの要素2,5,10を除いたベクトル
[1] 2 1 4 6 7 8 4 2
> x[x<4] ベクトル中、4より小さい要素のみを取り出す
[1] 2 1 3 2
数値の表
数学
物理
英語
学生A
90
90
45
学生B
85
91
55
学生C
20
46
93
学生D
45
67
95
ビール
缶詰
紙おむつ マスク
店舗A
40
90
55
25
店舗B
90
30
80
40
店舗C
21
61
35
10
店舗D
10
5
20
60
Rでは行列 (matrix) として表現
行列(matrix)
> matrix(1:6)
[,1]
[1,]
1
[2,]
2
[3,]
3
[4,]
4
[5,]
5
[6,]
6
>
> matrix(1:6, ncol=3)
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
>
> matrix(1:6, ncol=3, byrow=TRUE)
[,1] [,2] [,3]
[1,]
1
2
3
[2,]
4
5
6
>
> matrix(1:6, nrow=2, byrow=TRUE)
[,1] [,2] [,3]
[1,]
1
2
3
[2,]
4
5
6
行列は関数matrixを用い、
ベクトルをおりたたんで生成
> x <- matrix(c(1,9,2,8,3,7,4,6), ncol=4)
> x
[,1] [,2] [,3] [,4]
[1,]
1
2
3
4
[2,]
9
8
7
6
> x <- matrix(c(1,9,2,8,3,7,4,6), ncol=4, byrow=TRUE)
> x
[,1] [,2] [,3] [,4]
[1,]
1
9
2
8
[2,]
3
7
4
6
> Z <- matrix(1:6, ncol=3)
>
> dim(Z)
# 行列のサイズ
[1] 2 3
>
> ncol(Z)
# 列の数
[1] 3
>
> nrow(Z)
# 行の数
[1] 2
>
> Z[1,2]
# 要素の取り出し
[1] 3
>
> Z[1,]
# 行の取り出し
[1] 1 3 5
>
> Z[,2]
# 列の取り出し
[1] 3 4
>
> length(Z) # 全要素の数
[1] 6
1
2
3
4
5
6
本日の講義内容
・ ベクトルと行列
・ ファイルからの行列の読み込み
・ 繰り返し処理
・ プログラムの作成
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりダウンロード
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
より matrix1.txt をダウンロードし、ドキュメント
Directory(Zドライブ)におく
matrix1.txtには以下の内容が書いてある
2
9
4
1
3
8
2
5
1
2
4
9
7
6
4
3
1
2
3
9
5
1
2
2
9
4
1
3
6
1
この10行3列の行列のファイルを
ドキュメントdirectory (Zドライブ)
におく。
> x <- read.table("Z:matrix1.txt")
> x
V1 V2 V3
1
2 4 5
2
9 9 1
3
4 7 2
4
1 6 2
5
3 4 9
6
8 3 4
7
2 1 1
8
5 2 3
9
1 3 6
10 2 9 1
xの2列目を取り出してベクトルを作る
> x[,2] 今までと同じ
[1] 4 9 7 6 4 3 1 2 3 9
> x$V2 これでもできる
[1] 4 9 7 6 4 3 1 2 3 9
本日の講義内容
・ ベクトルと行列
・ help関数、その他
・ ファイルからの行列の読み込み
・ 繰り返し処理
・ プログラムの作成
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりダウンロード
繰り返し処理の書き方 (1) for ループ
for ( i
in ベクトル )
{
繰り返し処理の内容
}
制御変数 i はベクトルの要素の値を毎回とる
( 変数名は i である必要はない)
ベクトルの次元数だけ処理が繰り返される
通常 ベクトルの与え方は 1:10
などのようの i が1づつ増えるように書くことが多い。
複数行にわたるコマンドやプログラムの作成には
エディターを使いましょう。
コンソールに一から入力すると、間違えた時に
最初から入力のやり直しが必要
エディターに書き込んでから、コピペでコンソールに
持ってくるようにすると、間違った時の修正が簡単
(1) エディターの開き方
(2) 書き込み
(3) 保存
を覚えよう
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりsampleR1.txtをダウンロードし、コピペで実行
1から5までの数字を
j <- 0
for (i in 1:5)
j <- j + i
}
print(j)
足す処理
{
i
左辺のj
i = 1
1
i = 2
3
i = 3
6
i = 4
10
i = 5
15
更新されたj
for 文で iは1から5まで
変化し、各i について
{}内の処理が行われる。
<<<<<-
右辺のj
i
0
+ 1
1
+ 2
3
+ 3
6
+ 4
10
+ 5
前のステップのj R上で 1+2+3+4+5 を実行して同じになるか確認しよう
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりsampleR3.txtをダウンロードし、コピペで実行
x <- read.table(“Z:matrix1.txt”)
for (i in 1:length(x[,1])) {
y <- x[i,1]*x[i,2]-x[i,3]
print(y)
}
length ベクトルの長さを出力する関数
x[,1] 行列xの1列目をベクトルと見なす
length(x[,1])は行列xの行数
i 行の1列目と2列目の積から3列目を減じる処理を
for文で繰り替えしている
繰り返し処理の一つの利用法は、ベクトルや行列の
値の参照である
forループは以下のような使い方も可能
(1)
for (i in 3:6) { print(i)}
ループの始まりは1でなくとも良い
(2)
for (i in seq(2,6,0.5)) { print(i)}
2から6なで0.5単位でiが増加
(3)
for (i in c(6,5,9,2,1)) { print(i)}
必ずしも規則的に増加するようにとらなくてもよい
(4)
for (i in 10:4) { print(i)}
(3)と同じことだが、減少させるようにとることもできる
※ in の後ろはいずれもベクトルになっている点に注意
本日の講義内容
・ ベクトルと行列
・ ファイルからの行列の読み込み
・ 繰り返し処理
・ プログラムの作成
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりダウンロード
Rには様々な関数が容易されているが自分の
データの処理には足りない場合がある。
自分のオリジナル関数を作成しよう
Rでは、自分の関数は次のように作成する。
関数名 <- function(引数1, 引数2, …)
{
括弧内の引数を使った処理を記述
return (戻り値)
}
例えば xとyの積を求める関数は次のように書ける。
xy <- function(x, y)
return (x*y)
}
{
※ 引数をx, yにする必然性はなく、他の変数名でも構わない
処理の記述部分には引数として与えられた変数名で記述
関数の作成には、Rのコンソールから直接入力するのではなく
メモ帳か、Rのメニューバーからファイルメニュー → 新規文書
として文書を開くかして、それらエディター上で作成する方が良い。
何故か?
コードを間違った時の修正が容易
特に長いプログラムの場合、コンソールから直接入力していると
間違った場合、また最初から入力し直す必要があるので大変
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりxy.Rをダウンロード
プログラムのファイルは拡張子をRとしておく。
ドキュメントフォルダ(Zドライブ)におく。
xy.Rをsourceで、実行中のコンソール画面から読み込むと
オリジナル関数xyを利用できるようになる。
> source("Z:xy.R")
> xy(4,5)
[1] 20
> xy(1.41421356, 1.41421356)
[1] 2
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりnaiseki.RとsampleR4.txtをダウンロード
問題2
forループを使って、与えられた2つのベクトルの内積を
もとめるプログラムを作成してみる。
naiseki.Rを穴埋めする形で作成
naiseki <- function(a, b)
len <j <- 0
for (i in 1:len) {
j <- j +
}
return (j)
}
{
完成させたファイルをsource(“Z:nakseki.R”)でよみこんで
sampleR4.txt中のベクトルのペアをコピペで与えて内積を計算
sampleR4.txtからコピペ
>
>
>
>
>
>
>
>
>
>
>
a <- c(1, -2, 3)
b <- c(-3, 2, 1)
m <- c(1.0, 2.3, 1.4, 1.6)
n <- c(6.7, 8.8, 1.1, 9.9)
x <- c(9, 9, 8, 1, 5)
y <- c(3.3, 3.3, 5.1, 2.2, 3.3)
a <- c(1, -2, 3)
b <- c(-3, 2, 1)
> naiseki(a, b)
[1] -4
関数定義の引数が、a, bで
> a %*% b
[,1]
あっても代入時の変数は
[1,]
-4
a, bである必要はない。
> naiseki(m, n)
[1] 44.32
内積は Rでは %*% で準備
> m %*% n
されているので、naisekiが
[,1]
[1,] 44.32
ちゃんと計算できているかを
> naiseki(x, y)
確認する
[1] 118.9
> x %*% y
[,1]
[1,] 118.9
> naiseki(c(1,2,3), c(3,2,1))
[1] 10
> c(1,2,3) %*% c(3,2,1)
[,1]
[1,]
10
関数の引数としてファイル名を与えることもできる
行列データの入っているファイル名を引数として与え
行列の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”というファイル名を文字列として代入
help機能について
help関数
Rの関数の使い方やオプションを知りたい時には
help関数が使える。
help(関数名)
-piからpiまでの区間に対するサイン曲線をcurve
で描きたい。その際、xの表示区間を-pi/2からpi/3
までに限定し、X軸にはラベルとしてRegion,
Y軸にはラベルとしてy=sin(x)とつけたい。
どのようにオプションをつけたら良いか?
> help(curve)
を実行
親切な人がRの使い方をweb上にあげてくれています。
helpよりもググった方が早い
curve R ラベル で検索
あるいは最初からこのサイトを調べる
ベクトルの形で与えられた数値データの
平均値を求めるプログラムを作成してみる。
forループを使用する。
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.html
よりheikin.R をダウンロード
heikin <- function(x)
len <1
j <- 0
for (i in
j <- j +
}
return
}
2
(j/len)
{
)
3
{
実はRには平均を求める関数meanが用意されている。
自作したheikinがmeanと同じ結果を与えるかを確認
> heikin(a)
[1] 0.6666667
> mean(a)
[1] 0.6666667
> heikin(b)
[1] 0
> mean(b)
[1] 0
> heikin(x)
[1] 6.4
> mean(x)
[1] 6.4
> mean(y)
[1] 3.44
> heikin(y)
[1] 3.44