四則演算と指数の計算は以下のような関係子でできる。
例えば以下のように。
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
数値をまとめてあつかう場合にこれをベクトルと呼び、以下のように作る。
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
ベクトルの要素に名前をつけるとわかりやすくて便利な場合がある。名前は 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
数値やベクトルをあつかう場合には、それらに名前をつけると便利なことが多い。名前をつけることを代入という。代入には、
名前 <- 数値やベクトル
という形式を取る。名前をタイプすると、その中身を見ることができる。例えば、以下のように。
x <- c(5, 1, 5)
x
## [1] 5 1 5
名前を使って計算することもできる。
y <- 2 : 4
x * y
## [1] 10 3 20
ベクトルの一部だけを取り出したい場合、何番目の値かを “[ ]”で指定してやる。
ベクトルの名前[取り出したい要素の番号]
例えば以下のように。
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
今までは、取り出したい要素を指定していたが、逆に取り出したくない要素を指定したほうが簡単な場合もある。その場合、取り出さない要素の番号にマイナスをつける。例えば以下のように
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
統計的なデータも 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
最終的な出力は適当な桁で四捨五入する必要がある。四捨五入は 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 も採用している四捨五入法で、こうすると丸め誤差が最小になるので、気にせずどんどん使えば良い。
ループを回すときなどに、変数の取りうる値のリストがほしい時がある。その場合、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
以下のようにすると、ベクトルの要素を昇順で並べ替えてくれる。
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
ベクトルの要素の数を知りたい場合がある。その場合、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
行列とは、数値などを長方形に配列したものである。行列のもっとも基本的な作り方は 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
同じ長さのベクトルをくっつけて行列を作ることもある。そのためには、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
同じ長さのベクトルをくっつける場合がほとんどだと思うが、長さが異なると、上の一番最後の例のように短い方のベクトルを繰り返して行列にしてしまう。
行列の要素もベクトルと同じように、[ ] を使うが、取り出したい要素の行と列が何番目かを指定してやる。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
行列の行や列を並べ替えたい場合がある。行数や列数が少なければ行や列の取り出し方を応用すれば良い。例えば以下のように。
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
** 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
文字も数字と同じようにベクトルや行列として扱える。R で文字を扱うときは必ず " " で文字をくくる。そうでないと文字ではなく数値などを代入したオブジェクトの名前だと R はみなしてしまう。以下の例を見よ。
c("Marx", "Weber", "Durkheim")
## [1] "Marx" "Weber" "Durkheim"
c(Marx, Weber, Durkheim)
## Error in eval(expr, envir, enclos): オブジェクト 'Marx' がありません
文字どうしをくっつける必要がある場合がある。その時は 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
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
論理値は、以下のような書式でベクトルや行列の要素を取り出すことにも用いられる。
ベクトル[同じ長さの論理値ベクトル]
こうすると、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
同じようにして特定の列だけ取り出すこともできる。
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
とする。「オプションの引数」とは、必ずしも指定する必要はないが、場合によっては指定したい引数のことである。
以下のような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
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() ではできないような作業に限定して使うのが良かろう。
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="自然対数のグラフ")
グラフ中に文字を書き加えたい場合がしばしばあるが、そのときは text( ) 関数を使う。
text(文字を描く場所のx座標, y座標, “描く文字”)
例えば以下のように。
plot(x, y, type="b")
text(20, 1000, "二次関数")
text(20, 800, expression(y == x^2)) # expression() を使うと TeXライクに数式が書けるようだが、詳しいことは知らない
作ったグラフの中に一部線を書き込みたい場合 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))
複数の図をならべてまとめて表示したい場合がある。そのような場合、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)
?関数名 でヘルプが見られる。英語だし決してわかりやすいとはいえないが、ないよりずっとマシだし、慣れてくれば役に立つ。使用例がついていて、特に役立つ。また、??キーワード あるいは ??“複数のキーワード” で関係ありそうな関数のヘルプのリストを出してくれる。
?lm
??"ordered logit"
日本語で聞きたいならば、WEB上で検索するとよい。英語でもかなりわかりやすい解説がある。以下の検索サイトが便利。
Seek R http://seekr.jp/
どんな学問分野でもそうだと思うが、自分で主体的にいろいろ調べてはじめて本当に知識は身につくと思うので、ぜひ積極的に R の使い方を自分で調べてほしい。
2.4.1 Comments コメント
プログラムの中にメモを書き込んでおくと非常に便利である。R は # から改行までの間は無視するので、 # の後ろにメモを書き込んでおく。これをコメントと呼ぶ。上のスクリプトはコメントの例にもなっている。