ベクトル

R のベクトルは、数学のベクトルとほぼ同じ概念である。数学では 1 つのベクトルに複数の要素を含めると同様に、R では 1 つのベクトルに複数の値を代入できる。

ベクトルの作成

ベクトルの作成は c を使う。複数の要素をカンマ区切りで c に代入すると、一つのベクトルとして生成される。また、等差数列や循環数列など、規則性のあるベクトルを作成する場合は seqrep などを使う。

x <- c(23, 17, 67, 127)
x
## [1]  23  17  67 127

x <- rep(c(1, 2), length = 10)
x
##  [1] 1 2 1 2 1 2 1 2 1 2

x <- rep(c(1, 2), times = 10)
x
##  [1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2

x <- rep(c(1, 2, 3), times = 3)
x
## [1] 1 2 3 1 2 3 1 2 3

x <- rep(c(1, 2, 3), times = c(3, 3, 3))
x
## [1] 1 1 1 2 2 2 3 3 3

x <- seq(1, 10, by = 2)
x
## [1] 1 3 5 7 9

x <- seq(1, 10, length = 2)
x
## [1] 1 10

x <- sequence(10)
x
##  [1]  1  2  3  4  5  6  7  8  9 10

x <- sequence(c(1, 2, 3, 4))
x
##  [1] 1 1 2 1 2 3 1 2 3 4

ベクトル要素の追加

既存のベクトルに新しい要素を追加したり、あるいは 2 つのベクトルを結合させたりしたい場合は、c または append を使う。c は、与えられた複数ベクトルを、与えられた順番で結合する。append は、デフォルトでは c と同じ機能を持つが、after などのオプションをつけると、1 つ目のベクトルの何番目の要素の後ろに、2 つ目のベクトルを挿入するかといった操作もできる。

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

w <- c(x, y)
w
## [1]  1  2  3  4  5 -1 -2 -3 -4 -5

w <- append(x, y)
w
## [1]  1  2  3  4  5 -1 -2 -3 -4 -5

w <- append(x, y, after = 2)
w
## [1]  1  2 -1 -2 -3 -4 -5  3  4  5

ベクトル要素の取得

ベクトルの要素を取り出すとき角括弧を使う。角括弧に取得したい要素の添字を書き入れる。他のプログラミング言語では、添え字は 0 から始まることが多い。これに対して、R では、添え字は 1 から始まる。

x <- c(21, 43, 556, 23)
x[3]
## [1] 556

x[c(1, 3)]
## [1] 21 556

x[-3]
## [1] 21 43 23

x[c(-1, -3)]
## [1] 43 23

例えば、5 未満の要素だけを取得したりするように、条件を指定して、その条件を満たす要素だけを取り出すこともできる。

y <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

z <- (y < 5)
z
## [1] T T T T F F F F F F

y[z]
## [1] 1 2 3 4

y[y < 5]
## [1] 1 2 3 4

ベクトルの並べ替え

ベクトルの要素を昇順または降順に並べるときは sort を利用する。

x <- c(1, 10, 20, 30, 40, 50, 60, 1, 30)

y <- sort(x)
y
## [1]  1  1 10 20 30 30 40 50 60

y <- sort(x, decreasing = TRUE)
y
## [1] 60 50 40 30 30 20 10  1  1

y <- sort(x, index.return = TRUE)
y$x
## [1]  1  1 10 20 30 30 40 50 60
y$ix
## [1] 1 8 2 3 4 9 5 6 7

sort と似た働きを持つ order 関数がある。sort はベクトルの要素を並べ替えて、その結果を返す。これに対して、order はベクトル要素を並べ換えるための添え字のベクトルを返す。

x <- c(1, 10, 20, 30, 40, 50, 60, 1, 30)

y <- order(x)
y
## [1] 1 8 2 3 4 9 5 6 7

y <- x[order(x)]
y
## [1]  1  1 10 20 30 30 40 50 60

y <- x[order(x, decreasing = TRUE)]
y
## [1] 60 50 40 30 30 20 10  1  1

y <- x[rev(order(x))]
y
## [1] 60 50 40 30 30 20 10  1  1


x <- c(7, 3, 1, 9, 5) 
y <- order(x) 
z <- x[y] 
z
## [1] 1 3 5 7 9

w <- z[order(y)]
w
## [1] 7 3 1 9 5

ベクトル要素の置換

ベクトルの値を変更したいとき、変更したい要素を直接指定して、新しい値を代入すればよい。

x <- c(10, 20, 30, 40, 50)
x[2] <- 0.2
x
## [1]   10  0.2  30  40  50

x[c(2, 4)] <- c(-20, -40)
x
## [1]  10 -20  30 -40  50

また、replace 利用しても置換できる。replace(x, y, z) のように使い、x には置換対象ベクトル、y には置換位置、z には置換後の内容を代入する。

x <- c(10, 20, 30, 40, 50)
y <- c(2, 4)
z <- c(-20, -40)

w <- replace(x, y, z)
w
## [1]  10 -20  30 -40  50

ベクトルの計算

記号入力例意味
+a+bベクトルaとベクトルbの和(a1+b1, a2+b2, …, an+bn)
-a-bベクトルaとベクトルbの差(a1-b1, a2-b2, …, an-bn)
*a*bベクトルaとベクトルbの積(a1*b1, a2*b2, …, an*bn)
/a/bベクトルaとベクトルbの商(a1/b1, a2/b2, …, an/bn)
%/%a%/%bベクトルaとベクトルbの整数商(a1%/%b1, a2%/%b2, …, an%/%bn)
%%a%%bベクトルaとベクトルbの余り(mod)(a1%%b1, a2%%b2, …, an%%bn)
^a^bベクトルaの成分へのベクトルbの成分累乗(a1b1, a2b2, …, anbn)
x <- c(0:5)
y <- c(5:0)
x + y
## [1] 5 5 5 5 5 5

計算対象となる 2 つのベクトルの長さが異なる場合、短い方のベクトルの要素が繰り返し利用される。ここはミスの元となる場合が多いので、注意すべき箇所と言える、

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
y <- c(1, 2, 3)
x * y
## [1]  1  4  9  4 10 18  7 16 27

x / y
## [1] 1.0 1.0 1.0 4.0 2.5 2.0 7.0 4.0 3.0

ベクトルの集合演算

R のベクトルに対して、2 つのベクトルの共通要素あるいは差分を取得したりするなどの、集合演算を行うことができる。

関数式入力式意味
unionunion(x, y)和集合
intersectintersect(x, y)積集合
setdiffsetdiff(x, y)差集合(1 つ目のベクトルから 2 つめのベクトルを引く)
setequalsetequal(x, y)集合としてこれらのベクトルは等しいか否か
x <- c(1:7)
y <- c(4:9)

union(x, y)
## [1] 1 2 3 4 5 6 7 8 9

intersect(x, y)
## [1] 4 5 6 7

setdiff(x, y)
## [1] 1 2 3

setequal(x, y)
## [1] FALSE