<- c(1, 2, 3, "4", 5)
vector vector
[1] "1" "2" "3" "4" "5"
class(vector)
[1] "character"
これまでベクトルやデータフレームを利用してきた。これらは,Rのデータ構造の一つである。Rではほかにもいくつか知っておくと便利なデータ構造が用意されている。
Rのデータ構造には以下のようなものがある。
ここでは,ベクトル,行列,配列,リストについて説明する。データフレームについては,データフレームで説明する。
ベクトルについては,Rの基本でも述べたが,ここではもう少し詳しく説明する。
ベクトルは数値,文字列,論理値 (TRUE
かFALSE
の二値)を要素としてもつことができるが,ベクトルの要素はすべて同じ型でなければならない。たとえば,数値と文字列を混ぜてベクトルを作成すると,すべての要素が文字列に変換される。
同様に数値と論理値を混ぜてベクトルを作成すると,論理値は数値 (TRUE
は1,FALSE
は0)に変換される。
ベクトルの要素を取り出したいときには,ベクトル名の後に[]
をつけて,[]
内に取り出したい要素の番号 (インデックスという)を指定する。
[1] 3
[1] 1 2 3
[1] 1 3 5
[]
を用いれば,ベクトルの特定の要素を変更することも可能。
ベクトルの末尾に要素を追加するには,append()
関数を用いる。
または,length()
関数を用いて,ベクトルの長さを取得し,その長さに1を足したものをインデックスとして指定して代入することも可能。
ベクトルの要素を削除するには,-
を用いる。
ベクトルを結合するには,c()
で要素にベクトルを指定すれば良い。
ベクトルの各要素には名前をつけることができる。要素に名前をつけるには,以下のようにする。
甲 乙 丙
1 2 3
a b c
1 2 3
名前つきベクトルは,名前を使って要素を取り出すことができる。
長さが同じベクトルどうしの計算では,要素どうしの計算が行われる。
長さが異なるベクトルどうしの計算では,短い方のベクトルの要素が繰り返し使われる。
[1] -3 -3 -3 -6 -6 -6
[1] 4 10 18 7 16 27
# vector2の長さがvector1の長さの整数倍でなくても計算はできるが,警告が出る
## この場合は,vector1がc(1, 2, 3, 10, 1, 2)として計算される
v1 <- append(v1, 10)
v1 - v2
Warning in v1 - v2: longer object length is not a multiple of shorter object
length
[1] -3 -3 -3 3 -7 -7
Warning in v1 * v2: longer object length is not a multiple of shorter object
length
[1] 4 10 18 70 8 18
したがって,ベクトルとスカラー (長さが1のベクトル)の計算では,ベクトルの各要素に対して計算が行われる。
行列もすべての要素が同じ型でなければならない。
行列を作成するにはmatrix()
関数を用いる。matrix()
関数は第1引数にベクトル,第2引数にnrow
で行数,またはncol
で列数を指定する。
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
引数で与えたベクトルの要素が順番に行数の分ずつ取り出され,行列の列になる。これは,nrow
を指定してもncol
を指定しても同じである。ベクトルの要素を順番に列数の分ずつ取り出して,行列の行にしたい場合には,byrow = TRUE
を指定する。
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
行列の要素を取り出したいときには,[行番号, 列番号]
を用いる。
行番号もしくは列番号のいずれか一方だけを指定すれば,行ベクトルもしくは列ベクトルを取り出すことができる。
m <-matrix(1:12, nrow = 3)
# 2行目の行ベクトルを取り出す
## 行を指定したことがわかるように,[2, ]のように
## 行番号のあとにカンマをつける必要があることに注意
m[2, ]
[1] 2 5 8 11
[1] 7 8 9
ベクトルと同様に[]
を用いれば,行列の特定の要素を変更することもできる。
行列は,行と列に名前をつけることができる。行の名前はrownames()
,列の名前はcolnames
で設定できる。行列の要素は名前を使って取り出すことができる。
ベクトルや行列を結合するには,cbind()
関数やrbind()
関数を用いる。cbind()
は列方向の結合,rbind()
は行方向の結合を行う。たとえば,各ベクトルを行列の列として結合するには,cbind()
,各ベクトルを行列の行として結合するには,rbind()
を用いる。
v1 v2
[1,] 1 4
[2,] 2 5
[3,] 3 6
[,1] [,2] [,3]
v1 1 2 3
v2 4 5 6
v1 v2
[1,] 1 4
[2,] 2 5
[3,] 3 6
[4,] 1 4
[5,] 2 5
[6,] 3 6
[,1] [,2] [,3] [,4] [,5] [,6]
v1 1 2 3 1 2 3
v2 4 5 6 4 5 6
Error in cbind(v3, v4): number of rows of matrices must match (see arg 2)
Error in rbind(v3, v4): number of columns of matrices must match (see arg 2)
行列どうしで+
, -
, *
, /
といった演算を行うと,ベクトルの場合と同様に行列の要素どうしの計算となる。次元が異なる行列どうしの計算はできない (エラーになる)。
[,1] [,2] [,3] [,4]
[1,] 14 20 26 32
[2,] 16 22 28 34
[3,] 18 24 30 36
[,1] [,2] [,3] [,4]
[1,] 13 64 133 220
[2,] 28 85 160 253
[3,] 45 108 189 288
ここからは,いわゆる線形代数のオペレーション。
行列の転置は,t()
関数で行うことができる。
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
行列の積を求めるには,%*%
を用いる。
[,1] [,2] [,3]
[1,] 334 422 510
[2,] 392 496 600
[3,] 450 570 690
逆行列を求めるには,solve()
関数を用いる。
例として,最小二乗法をやってみよう。
配列は行列を多次元に拡張したもの,というより,正しくは2次元の配列が行列。
リストは,異なる構造のデータを束ねることができるオブジェクトである。リストは,ベクトル,行列はもちろん,リストも要素とすることができる。
[[1]]
[1] 4 3 2 1
[[2]]
[1] "a" "b" "c"
[[3]]
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
この例では,2つのベクトルと1つの行列を要素にもつl
というリストを作成している。長さが異なるベクトルも,次元が異なる行列もすべて1つのオブジェクトにまとめることができる。
リストから要素を取り出すには,[[ ]]
でインデックスを指定する。
[ ]
でインデックスを指定した場合は,リストが返されることに注意しよう。たとえば,l[2]
はl
の2番目の要素をもつ長さが1のリストを表す。
リストの中にリストを入れることもできる。
[[1]]
[[1]][[1]]
[1] 4 3 2 1
[[1]][[2]]
[1] "a" "b" "c"
[[1]][[3]]
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
[[2]]
[1] "A" "B" "C"
[[1]]
[1] 4 3 2 1
[[2]]
[1] "a" "b" "c"
[[3]]
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
[1] "A" "B" "C"
リストの要素には名前をつけることができる。
$x
[1] 1 2 3 4 5
$y
[1] "a" "b" "c"
$z
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
名前つきのリストの要素は,$
で取り出すことができる。
また,リストの名前はnames()
関数で取得できる。