1 Binary Operators 四則演算と対数、指数の計算

四則演算と指数の計算は以下のような関係子でできる。

例えば以下のように。

5 + 6
## [1] 11
10 - 3
## [1] 7
7 * 8
## [1] 56
4/11
## [1] 0.3636364
3 ^ 4
## [1] 81

カッコでくくればその中を先に計算する。例えば以下のように。

5 * (2 + 4)
## [1] 30

平方根は sqrt() 関数で計算する。

sqrt(数値)

例えば以下のように。

sqrt(3)
## [1] 1.732051

平方根は2分の1乗、つまり0.5乗なので、以下のようにしても同じである。

3 ^ 0.5
## [1] 1.732051

同じように3乗根、4乗根は以下のようにして計算できる。

3 ^ (1/3)
## [1] 1.44225
3 ^ 0.25
## [1] 1.316074

自然対数は、log( ) という関数で計算できる。

log(真数)

例えば以下のように。

log(13)
## [1] 2.564949

2 Vector ベクトル

数値をまとめてあつかう場合にこれをベクトルと呼び、以下のように作る。

c(数値, 数値, 数値, …)

例えば以下のように。

c(6, 0, 6, 8, 5, 0, 1)
## [1] 6 0 6 8 5 0 1

a から b までの連番のベクトルは、

a:b

で作れる。例えば、以下のように。

1:7
## [1] 1 2 3 4 5 6 7
3:-2
## [1]  3  2  1  0 -1 -2

ベクトルは足し算や引き算などの計算もできる。

c(1, 4, 5) + c(2, 2, 2)
## [1] 3 6 7
c(2, 1, 6) - 5
## [1] -3 -4  1
c(1, 1, 2, 2) * c(3, 2)
## [1] 3 2 6 4

同じ数値やベクトルを n 回繰り返したい場合は、

rep(ベクトル, n)

とする。例えば以下のように。

rep(c(1, 5, 4), 3)
## [1] 1 5 4 1 5 4 1 5 4

2.1 Names of Elements ベクトルの要素の名前

ベクトルの要素に名前をつけるとわかりやすくて便利な場合がある。名前は names() を使って以下のようにつける。

names(ベクトル名) <- c(“一番目の要素の名前”, “二番目の要素の名前”, …)

以下は具体例。

death.date <- c(1883, 1920, 1917)
death.date
## [1] 1883 1920 1917
names(death.date) <- c("Marx", "Weber", "Durkheim")
death.date
##     Marx    Weber Durkheim 
##     1883     1920     1917

2.2 Assignment 代入/付置

数値やベクトルをあつかう場合には、それらに名前をつけると便利なことが多い。名前をつけることを代入という。代入には、

名前 <- 数値やベクトル

という形式を取る。名前をタイプすると、その中身を見ることができる。例えば、以下のように。

x <- c(5, 1, 5)
x
## [1] 5 1 5

名前を使って計算することもできる。

y <- 2 : 4
x * y
## [1] 10  3 20

2.3 Selecting and Modifying Subsets of Vectors ベクトルの要素の取り出し

ベクトルの一部だけを取り出したい場合、何番目の値かを “[ ]”で指定してやる。

ベクトルの名前[取り出したい要素の番号]

例えば以下のように。

z <- c(0, 4, 3, 7, 6, 1)
z[2]
## [1] 4
z[5]
## [1] 6

いかのようにすれば複数の要素を一度にとりだすこともできる。

ベクトルの名前[取り出したい要素の番号のベクトル]

例えば以下のように。

z[c(1, 4)]
## [1] 0 7
z[3:6]
## [1] 3 7 6 1

この方法で、ベクトルの特定の要素だけを置き換えることもできる。書式は以下の通り。

ベクトルの名前[置き換えたい要素の番号のベクトル] <- 新しい値のベクトル

例は以下の通り。

(b <- 1:7) # カッコでくくると代入すると同時に中身も表示してくれる
## [1] 1 2 3 4 5 6 7
b[2] <- 10 # 2番目の要素を10で置き換える。
b
## [1]  1 10  3  4  5  6  7
b[3:5] <- c(15, 20, 25) # 3,4,5番目の要素も置き換える
b
## [1]  1 10 15 20 25  6  7

2.4 Deleting Subsets of Vectors 取り出さない要素の指定

今までは、取り出したい要素を指定していたが、逆に取り出したくない要素を指定したほうが簡単な場合もある。その場合、取り出さない要素の番号にマイナスをつける。例えば以下のように

b[c(1:2, 4:7)]
## [1]  1 10 20 25  6  7
b[-3]
## [1]  1 10 20 25  6  7
b[c(1:2, 4, 6:7)]
## [1]  1 10 20  6  7
b[c(-3, -5)]
## [1]  1 10 20  6  7

2.4.1 Comments コメント

プログラムの中にメモを書き込んでおくと非常に便利である。R は # から改行までの間は無視するので、 # の後ろにメモを書き込んでおく。これをコメントと呼ぶ。上のスクリプトはコメントの例にもなっている。

2.5 Frequently Used Functions よく使う関数

2.5.1 Descrptive Statistics 記述統計

統計的なデータも R の中ではベクトルとして扱われる。平均値や分散など、一変数に対して使う記述統計もベクトルを引数に指定して計算する。

sum(ベクトル) # ベクトルの値の合計

mean(ベクトル) # ベクトルの値の平均値

var(ベクトル) # ベクトルの分散(N ではなく N-1 で割っている点に注意)

sd(ベクトル) # ベクトルの標準偏差(       〃        )

summary(ベクトル) # 最大値、最小値、四分位点、平均値を計算

以下はこれらの使用例。

b
## [1]  1 10 15 20 25  6  7
sum(b)
## [1] 84
mean(b)
## [1] 12
var(b)
## [1] 71.33333
sd(b)
## [1] 8.445906
summary(b)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     1.0     6.5    10.0    12.0    17.5    25.0

2.5.2 Rounding 四捨五入

最終的な出力は適当な桁で四捨五入する必要がある。四捨五入は round() でできる。

round(ベクトル, 求める少数桁数)

単体の数値は要素が一つのベクトルだとみなせるので、もちろん単体の数値でも四捨五入できる。以下は例。

round(3.141593, 2)
## [1] 3.14

実は、round は完全には四捨五入していない。以下が四捨五入になっていない例である。

round(c(0.15, 0.25, 0.35, 0.45, 0.55, 0.65), 1)
## [1] 0.2 0.2 0.4 0.4 0.6 0.6

0.15, 0.35, 0.55 を小数点以下第一位で四捨五入すると、0.2, 0.4, 0.6 になるのはいいが、0.25, 0.45, 0.65 は 0.2, 0.4, 0.6 になってしまっている。つまり、求める桁の数値が偶数でその一つ下の桁の数値が5のときは切り捨ててしまうのである。これは IEEE (The Institute of Electrical and Electronics Engineers) や JIS, ISO も採用している四捨五入法で、こうすると丸め誤差が最小になるので、気にせずどんどん使えば良い。

2.5.3 Unique Elements 重複する要素を削除し取りうるすべて値のベクトルを

ループを回すときなどに、変数の取りうる値のリストがほしい時がある。その場合、unique() という関数が便利である。

unique(ベクトル)

で、重複する要素を取り除いたベクトルが返される。例えば以下のように。

x <- c(0:4, 2:6, 8:4)
x
##  [1] 0 1 2 3 4 2 3 4 5 6 8 7 6 5 4
unique(x)
## [1] 0 1 2 3 4 5 6 8 7

2.5.4 Sort 昇順でソート

以下のようにすると、ベクトルの要素を昇順で並べ替えてくれる。

sort(ベクトル)

例えば以下のように。

x <- c(0:4, 2:6, 8:4)
x
##  [1] 0 1 2 3 4 2 3 4 5 6 8 7 6 5 4
sort(x)
##  [1] 0 1 2 2 3 3 4 4 4 5 5 6 6 7 8

2.6 Length of Vector ベクトルの長さ

ベクトルの要素の数を知りたい場合がある。その場合、length() 関数を使う。

length(ベクトル)

で要素の数を返してくれる。例えば以下のように。

x <- c(2, 4, 7, 6, 1:10)
x
##  [1]  2  4  7  6  1  2  3  4  5  6  7  8  9 10
length(x)
## [1] 14

3 Matrix 行列

行列とは、数値などを長方形に配列したものである。行列のもっとも基本的な作り方は matrix() を使ったものである。

matrix(行列の要素となる数値のベクトル, 行数)

例えば以下のように。

matrix(c(6, 0, 7, 8, 5, 1), 3)
##      [,1] [,2]
## [1,]    6    8
## [2,]    0    5
## [3,]    7    1

以下のように、行列には名前も付けられるし、ベクトルと同じように計算もできる。

A <- matrix(1:12, 4)
A / 2
##      [,1] [,2] [,3]
## [1,]  0.5  2.5  4.5
## [2,]  1.0  3.0  5.0
## [3,]  1.5  3.5  5.5
## [4,]  2.0  4.0  6.0
B <- matrix(13:24, 4)
A + B
##      [,1] [,2] [,3]
## [1,]   14   22   30
## [2,]   16   24   32
## [3,]   18   26   34
## [4,]   20   28   36

3.1 Binding Vectors ベクトルをくっつけて行列を作る

同じ長さのベクトルをくっつけて行列を作ることもある。そのためには、rbind() または cbind() という関数を使う。

rbind(一行目のベクトル, 二行目のベクトル, …)

cbind(一列目のベクトル, 二列目のベクトル, …)

rbind()は引数のベクトルが行に対応するのに対して、cbind() は引数のベクトルが列に対応する。以下は使用例。

x <- 1 : 5
y <- 3 * x
z <- 2 ^ x
rbind(x, y, z)
##   [,1] [,2] [,3] [,4] [,5]
## x    1    2    3    4    5
## y    3    6    9   12   15
## z    2    4    8   16   32
cbind(x, y, z)
##      x  y  z
## [1,] 1  3  2
## [2,] 2  6  4
## [3,] 3  9  8
## [4,] 4 12 16
## [5,] 5 15 32
rbind(x, 6:7)
## Warning in rbind(x, 6:7): number of columns of result is not a multiple of
## vector length (arg 2)
##   [,1] [,2] [,3] [,4] [,5]
## x    1    2    3    4    5
##      6    7    6    7    6

同じ長さのベクトルをくっつける場合がほとんどだと思うが、長さが異なると、上の一番最後の例のように短い方のベクトルを繰り返して行列にしてしまう。

3.2 Selecting and Modifying Subsets of a Matrix 行列の要素の取り出し

行列の要素もベクトルと同じように、[ ] を使うが、取り出したい要素の行と列が何番目かを指定してやる。a行b列の要素を取り出したい場合は、

行列名[a, b]

とする。例えば以下のように。

B[2,2]
## [1] 18

a行目すべて、b列目すべてを取り出したい場合は、

行列名[a, ]

行列名[, b]

とする。例えば以下のように。

B[2, ]
## [1] 14 18 22
B[, 2]
## [1] 17 18 19 20

行列も複数の要素をベクトルと同じように一度に取り出せる。例えば以下のように。

B[1:3, ] # B の 1~3 行目
##      [,1] [,2] [,3]
## [1,]   13   17   21
## [2,]   14   18   22
## [3,]   15   19   23
B[, c(1, 3)] # B の 1列目と3列目
##      [,1] [,2]
## [1,]   13   21
## [2,]   14   22
## [3,]   15   23
## [4,]   16   24
B[1:2, 2:3]  # Bの1, 2行目の2~3列目の部分 
##      [,1] [,2]
## [1,]   17   21
## [2,]   18   22

やはりベクトルと同じように、行列の要素も一部置き換えることができる。例えば以下のように。

C <- matrix(1:15, 3)
C
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    4    7   10   13
## [2,]    2    5    8   11   14
## [3,]    3    6    9   12   15
C[1, 2] <- 200
C
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1  200    7   10   13
## [2,]    2    5    8   11   14
## [3,]    3    6    9   12   15
C[, 3] <- 100:102
C
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1  200  100   10   13
## [2,]    2    5  101   11   14
## [3,]    3    6  102   12   15
C[2:3, 4:5] <- -1 : -4
C
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1  200  100   10   13
## [2,]    2    5  101   -1   -3
## [3,]    3    6  102   -2   -4

やはりベクトルと同じように、マイナスの符号を使って、取り出さない行や列を指定することができる。例えば以下のように。

C[2:3,]
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    2    5  101   -1   -3
## [2,]    3    6  102   -2   -4
C[-1, ] # 上とやっていることは同じ
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    2    5  101   -1   -3
## [2,]    3    6  102   -2   -4
C[c(1,3), c(1,4,5)]
##      [,1] [,2] [,3]
## [1,]    1   10   13
## [2,]    3   -2   -4
C[-2, -2:-3]
##      [,1] [,2] [,3]
## [1,]    1   10   13
## [2,]    3   -2   -4

3.3 Sorting a Matrix 行や列の並べ替え

行列の行や列を並べ替えたい場合がある。行数や列数が少なければ行や列の取り出し方を応用すれば良い。例えば以下のように。

B <- matrix(1:15, 5)
B
##      [,1] [,2] [,3]
## [1,]    1    6   11
## [2,]    2    7   12
## [3,]    3    8   13
## [4,]    4    9   14
## [5,]    5   10   15
B[, c(2, 3, 1)] # Bの2行目を1行目に、3行目を2行目に、1行目を3行目に持ってくる。
##      [,1] [,2] [,3]
## [1,]    6   11    1
## [2,]    7   12    2
## [3,]    8   13    3
## [4,]    9   14    4
## [5,]   10   15    5

しかし、並べ替える行や列の数が増えてくるとこれは現実的な方法ではない。その場合、order() 関数が役立つことが多い。

order(ベクトル)

で、そのベクトルの何番目の要素が一番小さく、そのベクトルの何番目の要素が二番目に小さく、といったことを順次、数字で表してくれる。ちょっとわかりにくいと思うので具体例を見てみよう。

x <- c(2, 5, 1, 7, 10, 8, 6, 0)
order(x)
## [1] 8 3 1 2 7 4 6 5

xの要素の中で一番小さいのは 8 番目の要素である 0 である。それゆえ、order(x)の1番目の要素は 8 である。xの要素の中で二番目に小さいのは3番目の要素である 1 である。それゆえ、order(x)の2番目の要素は 3 である。以下同様に最後まで数値を計算していく。

この order() は行列を昇順で並べるのに便利なのである。

行列[order(並べ替えの基準になるベクトル), ]

で行列を並べ替えられる。例えば以下のように。

y <- c(length(x):1)
C <- cbind(x, y)
C
##       x y
## [1,]  2 8
## [2,]  5 7
## [3,]  1 6
## [4,]  7 5
## [5,] 10 4
## [6,]  8 3
## [7,]  6 2
## [8,]  0 1
C[order(x), ]  # これはけっきょく下のようにしているのと同じ
##       x y
## [1,]  0 1
## [2,]  1 6
## [3,]  2 8
## [4,]  5 7
## [5,]  6 2
## [6,]  7 5
## [7,]  8 3
## [8,] 10 4
C[c(8, 3, 1, 2, 7, 4, 6, 5), ] 
##       x y
## [1,]  0 1
## [2,]  1 6
## [3,]  2 8
## [4,]  5 7
## [5,]  6 2
## [6,]  7 5
## [7,]  8 3
## [8,] 10 4

降順で並べ替えたい場合は、

order(ベクトル, decreasing =T)

とすればよい。

C[order(C[,1], decreasing=T), ] # Cの1列目は x と同じなのでどちらでも同じ結果がかえる
##       x y
## [1,] 10 4
## [2,]  8 3
## [3,]  7 5
## [4,]  6 2
## [5,]  5 7
## [6,]  2 8
## [7,]  1 6
## [8,]  0 1

3.4 Transposing a Matrix 行列の転置

** t() ** で行列を転置できる。

A <- matrix(1:24, 3)
A
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## [1,]    1    4    7   10   13   16   19   22
## [2,]    2    5    8   11   14   17   20   23
## [3,]    3    6    9   12   15   18   21   24
t(A)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## [4,]   10   11   12
## [5,]   13   14   15
## [6,]   16   17   18
## [7,]   19   20   21
## [8,]   22   23   24

4 Character Vector 文字型のデータ

文字も数字と同じようにベクトルや行列として扱える。R で文字を扱うときは必ず " " で文字をくくる。そうでないと文字ではなく数値などを代入したオブジェクトの名前だと R はみなしてしまう。以下の例を見よ。

c("Marx", "Weber", "Durkheim")
## [1] "Marx"     "Weber"    "Durkheim"
c(Marx, Weber, Durkheim)
## Error in eval(expr, envir, enclos):  オブジェクト 'Marx' がありません

4.1 Pasting Characters 文字列をくっつける

文字どうしをくっつける必要がある場合がある。その時は paste()関数を使う。

paste(文字列(のベクトル), 文字列(のベクトル), 文字列(のベクトル), …)

でできる。例えば以下のように。

paste("Emile", "Durkheim")
## [1] "Emile Durkheim"
paste("I", "have", "a", "dream.")
## [1] "I have a dream."
paste(1:10, "回")
##  [1] "1 回"  "2 回"  "3 回"  "4 回"  "5 回"  "6 回"  "7 回"  "8 回" 
##  [9] "9 回"  "10 回"

デフォルトではつなげる文字列の間には半角のスペースが挿入されるが、これを無くしたい場合は、 , sep=“” というオプションをつける。

paste(1:10, "回", sep="")
##  [1] "1回"  "2回"  "3回"  "4回"  "5回"  "6回"  "7回"  "8回"  "9回"  "10回"

文字型のデータでカテゴリカル変数として使うようなベクトルは、因子 (factor) という形式にすると回帰分析などのときに便利である。因子は、

factor(文字のベクトル)

で作れる。例えば以下のように。

sociologist <- factor(c("Marx", "Weber", "Durkheim", "Weber", "Durkheim"))
sociologist
## [1] Marx     Weber    Durkheim Weber    Durkheim
## Levels: Durkheim Marx Weber

規則的な因子は gl() という関数で作ると便利である。

gl(カテゴリ数, 繰り返し数, labels=各カテゴリの名前のベクトル)

例えば以下のように。

gl(3, 4, labels=c("Marx", "Weber", "Durkheim"))
##  [1] Marx     Marx     Marx     Marx     Weber    Weber    Weber   
##  [8] Weber    Durkheim Durkheim Durkheim Durkheim
## Levels: Marx Weber Durkheim

5 Logical Values 論理値

R では以下のような論理演算子を使って真偽の判断もでき、データ分析の際にも役に立つ。

例えば以下のように使う。

10 == 7
## [1] FALSE
10 > 7
## [1] TRUE
9 < 9
## [1] FALSE
9 >= 9
## [1] TRUE
"Weber" == "WEBER" & 5 > 2
## [1] FALSE
"Weber" == "WEBER" | 5 > 2
## [1] TRUE

論理演算の結果は TRUE と FALSE のいずれかを返す。これらの論理値は T と F で代用できる。

T | F
## [1] TRUE
T & F
## [1] FALSE

論理値のベクトルや行列も作ることができ、演算も可能である。例えば以下のように。

X <- matrix(1:9, 3)
X
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
(X1 <- X > 3) # () でくくると代入するだけでなくその内容も表示する
##       [,1] [,2] [,3]
## [1,] FALSE TRUE TRUE
## [2,] FALSE TRUE TRUE
## [3,] FALSE TRUE TRUE
(X2 <- X < 8)
##      [,1] [,2]  [,3]
## [1,] TRUE TRUE  TRUE
## [2,] TRUE TRUE FALSE
## [3,] TRUE TRUE FALSE
X1 & X2
##       [,1] [,2]  [,3]
## [1,] FALSE TRUE  TRUE
## [2,] FALSE TRUE FALSE
## [3,] FALSE TRUE FALSE

5.1 Selecting Subsets with Logical Values 論理値を使ったベクトルや行列の要素の取り出し

論理値は、以下のような書式でベクトルや行列の要素を取り出すことにも用いられる。

ベクトル[同じ長さの論理値ベクトル]

こうすると、TRUEに対応する要素だけを取り出してくれる。例えば以下のように。

a <- c(1, 10, 20, 5, 6, 33)
a[c(T, F, T, F, T, F)]
## [1]  1 20  6
a[a > 10]
## [1] 20 33

同じようにして、以下の書式で行列の特定の行だけ取り出すこともできる。

行列[行数と同じ長さの論理ベクトル, ]

例えば以下のように。

X
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
X[c(T, F, T), ]
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    3    6    9
X[1:3 > 2, ] # 1:3 > 2 は FALSE FALSE TRUE を返す
## [1] 3 6 9
X[X[,1] > 2, ] # Xの1列目が2より大きい行だけ取り出す
## [1] 3 6 9

同じようにして特定の列だけ取り出すこともできる。

6 Repetition and Loops 繰り返しの計算

6.1 apply を使った行別、列別の計算

mean() や sd() のような関数は行列を引数にとることもできる。

C
##       x y
## [1,]  2 8
## [2,]  5 7
## [3,]  1 6
## [4,]  7 5
## [5,] 10 4
## [6,]  8 3
## [7,]  6 2
## [8,]  0 1
mean(C)
## [1] 4.6875
sd(C)
## [1] 2.960152

上の例では C という行列の 12個の要素全体の平均や標準偏差を計算しているが、行ごと、あるいは列ごとに平均や標準偏差を計算したい場合もある。例えば行ごとに平均を計算したい場合、

mean(C[1, ])
## [1] 5
mean(C[2, ])
## [1] 6
mean(C[3, ])
## [1] 3.5

とすればいいのであるが、行数が多いと上のようなスクリプトを書くのは面倒である。そこで、 apply() という関数を使う。一般的には以下のように書く。

apply(行列, 行別なら1、列別なら2, 関数, オプションの引数)

例えば、上と同じ計算を apply() を使って行うと、

apply(C, 1, mean)
## [1] 5.0 6.0 3.5 6.0 7.0 5.5 4.0 0.5

とすればよい。列別に標準偏差を計算するならば、

apply(C, 2, sd) # 列別なので二番目の引数は 2
##        x        y 
## 3.563205 2.449490

とする。「オプションの引数」とは、必ずしも指定する必要はないが、場合によっては指定したい引数のことである。

6.2 tapply を使ったグループ別の計算

以下のような3つのグループがあり、グループ別に幸福度の平均値や標準偏差を計算したいとしよう。

グループ 幸福度
A 2
A 4
A 7
B 1
B 3
C 3
C 9
C 5
C 7

以下のように計算すれば、グループ別の計算はできる。

H <- c(2, 4, 7, 1, 3, 3, 9, 5, 7)
mean(H[1:3]) # 1~3番目のデータの平均
## [1] 4.333333
mean(H[4:5])
## [1] 2
mean(H[6:9])
## [1] 6

しかし、やはりグループ数が多くなってきたり、グループ別にデータがソートされていないとスクリプトを書くのが面倒になってくる。そこで tapply() を使う。一般的には、

tapply(ベクトル, グループ分けのためのベクトル, 関数, オプションの引数)

と書く。上のグループ別の平均幸福度の計算は、tapply を使うと以下のようになる。

Group <- c(rep("A", 3), rep("B", 2), rep("C", 4))
Group
## [1] "A" "A" "A" "B" "B" "C" "C" "C" "C"
tapply(H, Group, mean)
##        A        B        C 
## 4.333333 2.000000 6.000000

6.3 for で繰り返し処理

apply や tapply では繰り返し処理が難しい場合もある。そのような場合 for() 関数が便利である。大雑把に言うと次のような書式になる。

for (i in ベクトル){繰り返し作業させたいこと}

i は別の文字列でも構わないが、一文字のほうが簡単だと思う。Rは i に in のあとに指定したベクトルの要素を順次代入し、{}内の計算を順次行う。例えば以下のように。

x <- 0
for(i in 1:10){
  x <- c(x, i^2)
}
x
##  [1]   0   1   4   9  16  25  36  49  64  81 100

上の例ではまず i に 1 を代入し、{ } 内の計算を行う。次に 2 を代入し、再び{ } 内の計算を行う。これを 最後の 10 まで繰り返し行う。上の例は (0:10)^2 としても同じ結果が得られるので、有り難みがないが、for が便利な場合もある。

例えば、以下のようなデータが得られた時、1を大阪、2を京都、3を兵庫、4を奈良に置き換えた新しい変数を作りたいとしよう。

x <- c(4, 1, 2, 3, 1, 2, 4, 2, 2, 1, 3, 1, 3, 2)

このような場合、労を厭わなければ次のようにしてもよい。

y <- rep(NA, length(x)) # x と同じ長さの空のベクトルを作る
y [x==1] <- "大阪" # x2の一部の要素に"大阪"を代入。その要素の場所は、xの要素が1の場所(2, 5, 10, 12番目)。
y
##  [1] NA     "大阪" NA     NA     "大阪" NA     NA     NA     NA     "大阪"
## [11] NA     "大阪" NA     NA
y [x==2] <- "京都"
y [x==3] <- "兵庫"
y [x==4] <- "奈良"
y
##  [1] "奈良" "大阪" "京都" "兵庫" "大阪" "京都" "奈良" "京都" "京都" "大阪"
## [11] "兵庫" "大阪" "兵庫" "京都"

4府県しか無ければこれでもよいが、全国データで47都道府県すべてに関してこれを続けるのはかなり面倒である。そのような場合、for() 関数が便利である。

pref.name <- c("大阪", "京都", "兵庫", "奈良")
y <- rep(NA, length(x))
for(i in 1:4){
  y[x==i] <- pref.name[i]
}
y
##  [1] "奈良" "大阪" "京都" "兵庫" "大阪" "京都" "奈良" "京都" "京都" "大阪"
## [11] "兵庫" "大阪" "兵庫" "京都"

apply() や tapply() にできる作業は for() にもできるが、for() のほうが計算が遅いと言われている。それゆえ、大量のデータ処理をする場合などはできるだけ apply() や tapply() を使ったほうがいい。for() は apply() や tapply() ではできないような作業に限定して使うのが良かろう。

7 Plot グラフの描画

plot(xの値を示すベクトル, yの値を示すベクトル)

でグラフは書ける。例えば、以下のように。

x <- 1:50
y <- x^2
plot(x, y)

点は ,pch= という引数を加えることで色々な種類が指定できる。

plot(xのベクトル, yのベクトル, pch=0~25の数値、または文字)

例えば以下のように。

plot(x, y, pch=3)
x <- -5 : 5
plot(x, x^3, pch="M")

どの数値にどんな点が対応するかは

?pch

とすればヘルプの中に書いてある。

点の大きさは cex= で指定する。デフォルトの点の大きさが 1 なので、適当に 0.5 とか 3 とかしてすればその値に比例して点の大きさも変化する。

x <- 10:19
plot(x, log(x), cex=3)

cex や pch は単一の数値ではなく、ベクトルで指定してもいい。

x <- 10:19
plot(x, log(x), cex=(1:10)/3, pch=1:3)

上の例では、点の大きさは 1/3, 2/3, 1 と順次大きくなっていく。点のかたちは最初は丸 (pch=1)、二番目は三角 (pch=2)、次が十字 (pch=3)、4番目がまた丸 (pch=1)、という繰り返しになる。

点ではなく線で描きたい場合は , type=“l” とオプションをつけ、線と点を両方使いたい場合は , type=“b” とすればよい。以下は描画例。

plot(x, x^2, type="l")

x軸、y軸、および図の上のラベルを指定したい場合は、それぞれ

といった引数を追加すればよい。例えば以下のように。

x <- 1:50
plot(x, log(x), type="l", xlab="x", ylab="x の自然対数", main="自然対数のグラフ")

7.1 Writing Texts in a Plot グラフの中に文字を書き込む

グラフ中に文字を書き加えたい場合がしばしばあるが、そのときは text( ) 関数を使う。

text(文字を描く場所のx座標, y座標, “描く文字”)

例えば以下のように。

plot(x, y, type="b")
text(20, 1000, "二次関数")
text(20, 800, expression(y == x^2)) # expression() を使うと TeXライクに数式が書けるようだが、詳しいことは知らない

7.2 Drawing Lines グラフの中に線を書き込む

作ったグラフの中に一部線を書き込みたい場合 lines() 関数を使えばよい。

lines(線が通る点の x 座標のベクトル, 線が通る点の y 座標のベクトル)

x <- 1:8
plot(x, sqrt(x))
lines(x, log(x))

複数のテキストを一度に書き込むこともできる。

x <- 0:12
plot(x, x^2, type="l")
at.x <- c(2, 5, 8, 11) # テキストを描くx座標のベクトルを作る
at.y <- at.x^2 + 10      # テキストを描くy座標のベクトルを作る
text(at.x, at.y, paste("y =", at.x^2))

7.3 Multiple Figure Environment 描画領域の分割

複数の図をならべてまとめて表示したい場合がある。そのような場合、par( )関数を使う。

par(mfrow=c(a, b)) で描画領域を a 行 b 列に分割できる。

例えば以下のように。

par(mfrow=c(2, 3))
z <- -10:30
plot(z, 0.5 * z)
plot(z, 0.5 * z^2)
plot(z, 0.5 * sqrt(z))
plot(z, 0.5 /z)
plot(z, log(z))
plot(z, 2.72 ^ z)

8 Help ヘルプ

?関数名 でヘルプが見られる。英語だし決してわかりやすいとはいえないが、ないよりずっとマシだし、慣れてくれば役に立つ。使用例がついていて、特に役立つ。また、??キーワード あるいは ??“複数のキーワード” で関係ありそうな関数のヘルプのリストを出してくれる。

?lm
??"ordered logit"

日本語で聞きたいならば、WEB上で検索するとよい。英語でもかなりわかりやすい解説がある。以下の検索サイトが便利。

Seek R http://seekr.jp/

どんな学問分野でもそうだと思うが、自分で主体的にいろいろ調べてはじめて本当に知識は身につくと思うので、ぜひ積極的に R の使い方を自分で調べてほしい。

inserted by FC2 system