R のベクトルは、数学のベクトルとほぼ同じ概念である。数学では 1 つのベクトルに複数の要素を含めると同様に、R では 1 つのベクトルに複数の値を代入できる。
ベクトルの作成
ベクトルの作成は c
を使う。複数の要素をカンマ区切りで c
に代入すると、一つのベクトルとして生成される。また、等差数列や循環数列など、規則性のあるベクトルを作成する場合は seq
、rep
などを使う。
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 つのベクトルの共通要素あるいは差分を取得したりするなどの、集合演算を行うことができる。
関数式 | 入力式 | 意味 |
union | union(x, y) | 和集合 |
intersect | intersect(x, y) | 積集合 |
setdiff | setdiff(x, y) | 差集合(1 つ目のベクトルから 2 つめのベクトルを引く) |
setequal | setequal(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