Rのベクトルの扱い方のざっとした説明
スカラーとベクトル(配列)を分けて扱うことが多いプログラミング言語ですが、Rはスカラーを要素1のベクトルとして扱うため、もっとも基本的なデータ構造がベクトルとなります。他のプログラミング言語と大きく異なる部分なので、R以外のプログラミングに慣れている人にも注意がいります。
1 ベクトルの作成
もっとも基本的なデータ構造なのでベクトルの作り方は様々ですが、
<- c(3, 2, 1)
v1 <- c("s", "t", "a", "t", "i", "s", "t", "i", "c", "s") vc
と数字や文字列を並べてc
(combineの略です)で接続するのが簡単です。数式やモデル式も並べられます。
<- 1:3 v2
:
演算子を使うと、1つづつ増減するベクトルを作ることができます。:
よりも複雑なことをしたい場合はseq
関数を使います。
<- seq(1, 9, 2)
v3 v3
[1] 1 3 5 7 9
1から9(以下の間)2づつ増加するベクトルをつくりました。 ベクトルの長さを指定することもできます。
<- seq(1, 9, length.out = 5)
v3 v3
[1] 1 3 5 7 9
等間隔に1から9まで5つの数字をつくりました。
<- c(v1, v2) v4
c
はベクトルとベクトル、リストとベクトル、リストとリストを結合することもできます。
2 ベクトルの抽出
ベクトルは添字で位置を指定して、一部を取り出せませす。添字もベクトルで指定できます。
1] v1[
[1] 3
1番目の数字を取り出しました。
2:3] v1[
[1] 2 1
2から3番目の数字を取り出しました。 要素にマイナスをつけて指定すると、その要素以外を取り出せます。任意の要素を削除したベクトルをつくるときに使えます。
-1] v1[
[1] 2 1
-c(1, 3)] v1[
[1] 2
同じ要素を何度も取り出すことができます。
c(2, 2, 2, 2, 2)] vc[
[1] "t" "t" "t" "t" "t"
真偽値を使って選択もできます。
c("A", "B", "C", "D", "E")[c(TRUE, FALSE, FALSE, FALSE, TRUE)]
[1] "A" "E"
A
とE
に対応する真偽値だけTRUE
だったので、A
とE
が選択されました。
3 ベクトルへの代入
ベクトルの一部分だけを書き換えることもできます。
1] <- 4
v1[ v1
[1] 4 2 1
4 ベクトルの長さ
length
関数で調べることができます。
length(v1)
[1] 3
5 ベクトルの演算
要素が数字であれば、ベクトルは計算ができます。ベクトルとベクトルの四則演算は、ベクトルとベクトルの長さが同じ場合、左項のベクトルのi番目の要素が、右項のベクトルのi番目の要素に対応した計算になります。
1:3 + 4:6
[1] 5 7 9
1:3 - 4:6
[1] -3 -3 -3
1:3 * 4:6
[1] 4 10 18
1:3 / 4:6
[1] 0.25 0.40 0.50
4:6 %/% 2:4 # 整数商
[1] 2 1 1
4:6 %% 2:4 # 剰余
[1] 0 2 2
4:6)^(1:3) # 累乗 (
[1] 4 25 216
累乗^
は:
よりも先に計算されるので括弧をつけました。
5.1 ベクトルの長さが異なるとき
長いほうが短いほうの\(1\)以上の整数倍のときのみ、短い方が繰り返しで長くされてから、演算されます。つまり、
1:6 + 1:3
[1] 2 4 6 5 7 9
は、
1:6 + c(1:3, 1:3)
[1] 2 4 6 5 7 9
5.2 集合演算
ベクトルとベクトルで集合演算ができます。
<- c(1, 2, 2, 3, 4, 5)) (x
[1] 1 2 2 3 4 5
<- c(4, 5, 6, 7, 7, 8)) (y
[1] 4 5 6 7 7 8
union(x, y) # 和集合
[1] 1 2 3 4 5 6 7 8
intersect(x, y) # 積集合
[1] 4 5
setdiff(x, y) # 差集合
[1] 1 2 3
5.3 比較演算
比較演算子も要素それぞれで計算されます。
<- c(1, 2, 3)) (x
[1] 1 2 3
<- c(1, 3, 2)) (y
[1] 1 3 2
<- c(2, 3, 1)) (z
[1] 2 3 1
== x x
[1] TRUE TRUE TRUE
== y x
[1] TRUE FALSE FALSE
if
やwhile
といった条件文の中で使う場合は、all
やany
でまとめましょう。
all
はすべての要素が一致しているときのみTRUE
になります。
all(x == x)
[1] TRUE
all(x == y)
[1] FALSE
any
はどれかが一致しているときにTRUE
になります。
any(x == y)
[1] TRUE
any(x == z)
[1] FALSE
並び順や重複を無視して、含まれる要素の種類のみで比較することもできます。
setequal(x, y)
[1] TRUE
と同じ計算結果になります。この長さの自動拡張は便利なのですが、混乱を招くので注意しましょう。
5.4 行列として計算する
実は、行列積%*%
などでは、ベクトルはn行1列(n∈ℕ)の縦行列として計算されます。t
で転置すると1行n列の横行列です。
t(v2) %*% v1 # 内積になる
[,1]
[1,] 11
%*% t(v1) v2
[,1] [,2] [,3]
[1,] 4 2 1
[2,] 8 4 2
[3,] 12 6 3
6 重複の処理
データフレーム内の列に対してかけて、同じ人が重複して一覧に載っているときの割り出しに使えたりします。
6.1 重複になっている要素を見つける
vc
[1] "s" "t" "a" "t" "i" "s" "t" "i" "c" "s"
duplicated(vc)
[1] FALSE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE TRUE
duplicated(vc)] vc[
[1] "t" "s" "t" "i" "s"
6.2 重複の無いベクトルをつくる
unique(vc)
[1] "s" "t" "a" "i" "c"
7 ベクトルの並び替え
ベクトルの要素の参照で、ベクトルを並び替えることができます。
c("b", "a", "c")[c(2, 1, 3)]
[1] "a" "b" "c"
2番目のa
、1番目のb
、3番目のc
の並びになりました。
ベクトルの要素の順番をorder
関数で調べることができます。
<- c(6.075,1.181,7.717,1.433,4.301,9.158,5.997,3.991,0.806,6.86)
v6 order(v6) # 小さい方から要素の位置を列挙
[1] 9 2 4 8 5 7 1 10 3 6
order(v6, decreasing = TRUE) # 大きい方から要素の位置を列挙
[1] 6 3 10 1 7 5 8 4 2 9
7.1 逆順
rev
でベクトルの順序を逆にできます。
rev(1:10)
[1] 10 9 8 7 6 5 4 3 2 1
7.2 ソート
order
の結果で整列することができます。
order(v6)] v6[
[1] 0.806 1.181 1.433 3.991 4.301 5.997 6.075 6.860 7.717 9.158
sort
を使うと、この手順をまとめて処理できます。
sort(v6)
[1] 0.806 1.181 1.433 3.991 4.301 5.997 6.075 6.860 7.717 9.158
sort(v6, decreasing = TRUE)
[1] 9.158 7.717 6.860 6.075 5.997 4.301 3.991 1.433 1.181 0.806
8 ベクトルの中から指定した要素の位置を特定する
which
関数で簡単にできます。試しに1から10までの並びがランダムなベクトルを作って使ってみましょう。
<- (1:10)[order(runif(10))]) (v
[1] 1 2 5 6 10 9 3 4 7 8
6
の位置を探します。
<- which(v == 6)) (i
[1] 4
v[i]
[1] 6
9 ベクトルの要素の名前
ベクトルの要素には名前をつけて、ラベルとして扱うことができます。他のプログラミング言語では、見かけない仕様です。
names(v1) <- c("a", "b", "c")
v1
a b c
4 2 1
ちょっと気味の悪い代入演算に思えるかも知れませんが、names<-
と言う関数を呼び出しています。
つけた名前を使ってアクセスできます。
"a"] v1[
a
4
計算結果のベクトルや行列に名前をつけておいたほうが分かりやすくなりますし、関数の戻り値のオブジェクトの一部がベクトルや行列になっているとき、数字で位置を指定するよりも、名前でアクセスした方がコードの見通しが良くなります。
9.1 名前の消し方
名前が邪魔な場合は剥がしましょう。
"a"]] # 参照時は[[で剥がせる v1[[
[1] 4
c(v1, v2, use.names = FALSE) # 結合時はuse.names=FALSEで剥がせる
[1] 4 2 1 1 2 3
names(v1) = NULL # NULLを代入すれば消せる
v1
[1] 4 2 1