ベクトルの要素の追加・削除
次に、ベクトルの要素の追加と削除の仕方について見ていきます。
インデックスと名前、真偽値で追加と削除する例を紹介します。
インデックスで指定
まずインデックスで要素を追加・削除する方法について見ています。
例えば、20番目にある要素を追加したい、または削除したい場合によく用います。
インデックスで追加・削除する方法は以下の通りです。
- 11番目に11を追加したいときは、vec[11] <- 11
- ベクトルの末尾に12を追加したいときは、vec[length(vec) + 1] <- 12
- 11番目の要素を削除したいときは、vec <- vec[-11]
ベクトルの大括弧に追加したい位置を表すインデックスを渡し、そこに追加する要素を代入します。
また、マイナスのインデックスを渡すと、その位置の要素を削除することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | > #インデックスで追加・削除 > vec1[11] <- 11 #11番目に追加 > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 11 > > vec1[length(vec1) + 1] <- 12 #ベクトルの末尾に要素を追加 > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 11 12 > > vec1 <- vec1[-c(11, 12)] #11と12番目の要素の削除 > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 |
また、関数appendを使うことで指定したインデックス以降に要素またはベクトルを追加することが可能です。
1 2 3 4 5 6 7 8 9 | > vec1 <- append(vec1, c(new = 100), after = 5) #5番目と6番目の間に挿入 > vec1 A B C D E new F G H I J 1 2 3 4 5 100 6 7 8 9 10 > > vec1 <- append(vec1, c(new1 = -1, new2 = -2), after = 5) #5番目以降にベクトルを挿入 > vec1 A B C D E new1 new2 new F G H I J 1 2 3 4 5 -1 -2 100 6 7 8 9 10 |
名前で指定
追加または削除する要素の名前を指定する方法を紹介します。
次のように追加する要素の名前の指定や、名前に対応する要素を削除することができます。
- 名前が"K"である要素11を追加したいときは、vec["K"] <- 11
- 名前が"K"である要素を削除したいときは、vec <- subset(vec, subset = !(names(vec) %in% c("K")))
1 2 3 4 5 6 7 8 9 10 | > #名前で追加・削除 > vec1["K"] <- 11 #名前Kの要素を追加 > vec1 A B C D E new1 new2 new F G H I J K 1 2 3 4 5 -1 -2 100 6 7 8 9 10 11 > > vec1 <- subset(vec1, subset = !(names(vec1) %in% c("new", "new1", "new2", "K"))) #名前new、new1、new2、Kの要素の削除 > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 |
真偽値で指定
最後に真偽値で指定して削除する方法を紹介します。
こちらは削除のみの解説となります。真偽値で指定して特定の要素のみを削除する例を紹介します。
ベクトルの特定の要素を削除したいときは次のように実行します。
削除したい要素以外がTRUEとなるような真偽値のベクトルを渡すことで削除することが可能です。
- 11の要素を削除したいときは、vec <- vec[vec != 11]
- 12以上の要素を削除したいときは、vec <- vec[vec < 12]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | > #真偽値で削除 > vec1[seq(11, 15)] <- c(101, 102, 103, 104, 105) > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 > > vec1 <- vec1[vec1 != 101] #101を削除 > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 102 103 104 105 > > vec1 <- vec1[vec1 < 102] #102以上を削除 > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 |
ベクトルの結合
ベクトルの結合について見ていきます。
2つ以上のベクトルを結合したいときは、次のように関数cの引数に結合したいベクトルを渡します。
また、関数appendを使っても同様に結合することが可能です。
1 2 3 4 5 6 7 8 | > #ベクトルの結合 > vecA <- c(1, 2, 3, 4, 5) > vecB <- c(6, 7, 8, 9, 10) > > vecC <- c(vecA, vecB) > vecC <- append(vecA, vecB) > vecC [1] 1 2 3 4 5 6 7 8 9 10 |
ベクトルの並び替え・ソート
ベクトルの並び替え及びソートの仕方について紹介します。
要素の取得と同様に、インデックスと名前でベクトルの要素を並び替える方法を解説します。
インデックスで指定
まずインデックスでベクトルの要素を並び替えを行っていきます。
並び替え後の要素に対応するようにインデックスのベクトルを大括弧に渡すことで、ベクトルの要素を入れ替えることができます。
- 1番目を末尾に移動したいときは、vec <- vec[c(setdiff(seq_len(length(vec)), 1), 1)]
- 1から9番目を後ろに移動したいときは、vec <- vec[c(setdiff(seq_len(length(vec)), seq(1, 9)), seq(1, 9))]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | > #インデックスでソート > vec3 <- c(A = 2, B = 6, C = 9, D = 4, E = 1, F = 3, G = 7, H = 8, I = 10, J = 5) > vec3 A B C D E F G H I J 2 6 9 4 1 3 7 8 10 5 > > vec3 <- vec3[c(setdiff(seq_len(length(vec3)), 1), 1)] #1番目を末尾に移動 > vec3 B C D E F G H I J A 6 9 4 1 3 7 8 10 5 2 > > vec3 <- vec3[c(setdiff(seq_len(length(vec3)), seq(1, 9)), seq(1, 9))] #1から9番目を後ろに移動 > vec3 A B C D E F G H I J 2 6 9 4 1 3 7 8 10 5 |
また、ベクトルをソートしたいときは次のように関数orderを使います。
関数orderによりベクトルの順位を得ることができるので、その順位を大括弧に入れることでベクトルをソートすることができます。
降順にしたいときは、引数decreasingをTRUEにします。
1 2 3 4 5 6 7 | > vec3[order(vec3)] #昇順 E A F D J B G H C I 1 2 3 4 5 6 7 8 9 10 > > vec3[order(vec3, decreasing = TRUE)] #降順 I C H G B J D F A E 10 9 8 7 6 5 4 3 2 1 |
ベクトルの要素を逆順にしたいときは、関数revを使います。
1 2 3 4 5 6 | > vec3[rev(seq_len(length(vec3)))] #逆順 J I H G F E D C B A 5 10 8 7 3 1 4 9 6 2 > rev(vec3) J I H G F E D C B A 5 10 8 7 3 1 4 9 6 2 |
名前で指定
ベクトルに名前がある場合は名前で要素を並び替えることができます。
インデックスのときと同様に、並び替え後の要素に対応するように名前のベクトルを大括弧に渡すことで、並び替えができます。
- 名前"A"の要素を末尾に移動したいときは、vec <- vec[c(setdiff(names(vec), "A"), "A")]
1 2 3 4 5 | > #名前でソート > vec3 <- vec3[c(setdiff(names(vec3), "A"), "A")] #名前"A"の要素を末尾に移動 > vec3 B C D E F G H I J A 6 9 4 1 3 7 8 10 5 2 |
欠測値の処理
次に、欠測値の処理の方法について見ていきます。
ベクトルに含まれる欠測値を除去したいときは関数na.omitを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | > #欠測値 > vec4 <- c("a", "b", "c", "d", NA, "f", "e", "g") > vec5 <- c(NA, 2, 5, NA, 8, 10, 3, 9) > > na.omit(vec4) [1] "a" "b" "c" "d" "f" "e" "g" attr(,"na.action") [1] 5 attr(,"class") [1] "omit" > > na.omit(vec5) [1] 2 5 8 10 3 9 attr(,"na.action") [1] 1 4 attr(,"class") [1] "omit" |
ベクトルの型(type)の変更
ベクトルの型(type)の変更について見ていきます。
Rにはnumeric型、character型、logical型、factor型などの様々な方があります。
関数as.numeric、as.character、as.logical、as.factorでそれぞれnumeric型、character型、logical型、factor型への変更ができます。
実行例をいかにまとめました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | > #ベクトルの型の変更 > vec_num1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) > vec_num2 <- c(1, 0, 0, 1, 0, 1, 1, 1, 0, 1) > > vec_chr1 <- c("a", "b", "c", "d", "e", "f", "g") > vec_chr2 <- c("1", "2", "3", "4", "5") > vec_chr3 <- c("TRUE", "FALSE", "TRUE", "FALSE", "FALSE") > > vec_fac1 <- factor(c("A", "B", "B", "C", "A")) > vec_fac2 <- factor(c(1, 3, 2, 2, 3), levels = c(3, 2, 1)) > > vec_lgc <- c(TRUE, FALSE, TRUE, TRUE, FALSE) > > > as.character(vec_num1) #numeric⇒character [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" > as.factor(vec_num1) #numeric⇒factor [1] 1 2 3 4 5 6 7 8 9 10 Levels: 1 2 3 4 5 6 7 8 9 10 > as.logical(vec_num2) #numeric⇒logical [1] TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE TRUE > > as.factor(vec_chr1) #character⇒factor [1] a b c d e f g Levels: a b c d e f g > as.numeric(vec_chr2) #character⇒numeric [1] 1 2 3 4 5 > as.logical(vec_chr3) #character⇒logical [1] TRUE FALSE TRUE FALSE FALSE > > as.character(vec_fac1) #factor⇒character [1] "A" "B" "B" "C" "A" > as.numeric(as.character(vec_fac2)) #factor⇒numeric [1] 1 3 2 2 3 > > as.character(vec_lgc) #logical⇒character [1] "TRUE" "FALSE" "TRUE" "TRUE" "FALSE" > as.numeric(vec_lgc) #logical⇒numeric [1] 1 0 1 1 0 > as.factor(vec_lgc) #logical⇒factor [1] TRUE FALSE TRUE TRUE FALSE Levels: FALSE TRUE |
ベクトルの演算
ベクトルの演算について見ていきます。
numeric型のベクトルに関して次の表の演算を行うことができます。
和、差、積、商、べき乗、整数商、剰余、内積、テンソル積を計算することができます。
演算子 | 演算 |
+ | 和 |
- | 差 |
* | 積 |
/ | 商 |
^ | べき乗 |
%/% | 整数商 |
%% | 剰余 |
%*% | 内積 |
%o% | テンソル積 |
実行例は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | > #ベクトルの演算 > #和 > vec_num1 + 1 [1] 2 3 4 5 6 7 8 9 10 11 > 1 - vec_num1 [1] 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 > vec_num1 + c(2, 3, 4, 5, 6, 7, 8, 9, 10, 11) [1] 3 5 7 9 11 13 15 17 19 21 > vec_num1 + vec_num2 [1] 2 2 3 5 5 7 8 9 9 11 > > #差 > vec_num1 - 1 [1] 0 1 2 3 4 5 6 7 8 9 > 1 - vec_num1 [1] 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 > vec_num1 - c(2, 3, 4, 5, 6, 7, 8, 9, 10, 11) [1] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 > vec_num1 - vec_num2 [1] 0 2 3 3 5 5 6 7 9 9 > > #積 > vec_num1 * 2 [1] 2 4 6 8 10 12 14 16 18 20 > 2 * vec_num1 [1] 2 4 6 8 10 12 14 16 18 20 > vec_num1 * c(2, 3, 4, 5, 6, 7, 8, 9, 10, 11) [1] 2 6 12 20 30 42 56 72 90 110 > vec_num1 * vec_num2 [1] 1 0 0 4 0 6 7 8 0 10 > > #商 > vec_num3 <- c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3) > vec_num1 / 2 [1] 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 > 2 / vec_num1 [1] 2.0000000 1.0000000 0.6666667 0.5000000 0.4000000 0.3333333 0.2857143 0.2500000 0.2222222 0.2000000 > vec_num1 / c(2, 3, 4, 5, 6, 7, 8, 9, 10, 11) [1] 0.5000000 0.6666667 0.7500000 0.8000000 0.8333333 0.8571429 0.8750000 0.8888889 0.9000000 0.9090909 > vec_num1 / vec_num3 [1] 1.000000 2.000000 3.000000 4.000000 2.500000 3.000000 3.500000 4.000000 3.000000 3.333333 > > #べき乗 > vec_num1 ^ 2 [1] 1 4 9 16 25 36 49 64 81 100 > 2 ^ vec_num1 [1] 2 4 8 16 32 64 128 256 512 1024 > vec_num1 ^ c(2, 3, 4, 5, 6, 7, 8, 9, 10, 11) [1] 1 8 81 1024 15625 279936 5764801 134217728 3486784401 100000000000 > vec_num1 ^ vec_num3 [1] 1 2 3 4 25 36 49 64 729 1000 > > #整数商 > vec_num1 %/% 2 [1] 0 1 1 2 2 3 3 4 4 5 > 2 %/% vec_num1 [1] 2 1 0 0 0 0 0 0 0 0 > vec_num1 %/% c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5) [1] 1 2 1 2 1 2 1 2 1 2 > vec_num1 %/% vec_num3 [1] 1 2 3 4 2 3 3 4 3 3 > > #剰余 > vec_num1 %% 2 [1] 1 0 1 0 1 0 1 0 1 0 > 2 %% vec_num1 [1] 0 0 2 2 2 2 2 2 2 2 > vec_num1 %% c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5) [1] 0 0 1 0 2 0 3 0 4 0 > vec_num1 %% vec_num3 [1] 0 0 0 0 1 0 1 0 0 1 > > #内積 > vec_num1 %*% c(2, 3, 4, 5, 6, 7, 8, 9, 10, 11) [,1] [1,] 440 > vec_num1 %*% vec_num2 [,1] [1,] 36 > > #テンソル積 > vec_num1 %o% 2 [,1] [1,] 2 [2,] 4 [3,] 6 [4,] 8 [5,] 10 [6,] 12 [7,] 14 [8,] 16 [9,] 18 [10,] 20 > 2 %o% vec_num1 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 2 4 6 8 10 12 14 16 18 20 > vec_num1 %o% c(2, 3, 4, 5, 6, 7, 8, 9, 10, 11) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 2 3 4 5 6 7 8 9 10 11 [2,] 4 6 8 10 12 14 16 18 20 22 [3,] 6 9 12 15 18 21 24 27 30 33 [4,] 8 12 16 20 24 28 32 36 40 44 [5,] 10 15 20 25 30 35 40 45 50 55 [6,] 12 18 24 30 36 42 48 54 60 66 [7,] 14 21 28 35 42 49 56 63 70 77 [8,] 16 24 32 40 48 56 64 72 80 88 [9,] 18 27 36 45 54 63 72 81 90 99 [10,] 20 30 40 50 60 70 80 90 100 110 > vec_num1 %o% vec_num2 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 0 0 1 0 1 1 1 0 1 [2,] 2 0 0 2 0 2 2 2 0 2 [3,] 3 0 0 3 0 3 3 3 0 3 [4,] 4 0 0 4 0 4 4 4 0 4 [5,] 5 0 0 5 0 5 5 5 0 5 [6,] 6 0 0 6 0 6 6 6 0 6 [7,] 7 0 0 7 0 7 7 7 0 7 [8,] 8 0 0 8 0 8 8 8 0 8 [9,] 9 0 0 9 0 9 9 9 0 9 [10,] 10 0 0 10 0 10 10 10 0 10 |
集合演算
ベクトルの集合演算に関する関数を紹介します。
次の表の関数を用いることで、ベクトルの和集合、差集合、積集合を計算することができます。
また、集合として等しいかどうか、集合の要素であるかどうかも計算することもできます。
関数 | 演算 |
union | 和集合 |
setdiff | 差集合 |
intersect | 積集合 |
setequal | 同じ集合かどうか |
is.element | 集合の要素であるかどうか |
実行例は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | > #集合演算 > vec_num1 <- c(1, 2, 3, 4, 5) > vec_num2 <-c(4, 5, 6, 7) > vec_chr1 <- c("a", "b", "a", "c", "b") > vec_chr2 <- c("b", "c", "d", "e") > vec_chr3 <- c("a", "b", "c") > > #和 > union(vec_num1, vec_num2) [1] 1 2 3 4 5 6 7 > union(vec_chr1, vec_chr2) [1] "a" "b" "c" "d" "e" > > #差 > setdiff(vec_num1, vec_num2) [1] 1 2 3 > setdiff(vec_chr1, vec_chr2) [1] "a" > > #積 > intersect(vec_num1, vec_num2) [1] 4 5 > intersect(vec_chr1, vec_chr2) [1] "b" "c" > > #集合として等しいか > setequal(vec_num1, vec_num2) [1] FALSE > setequal(vec_chr1, vec_chr3) [1] TRUE > > #集合の要素か > is.element(vec_num1, 1) [1] TRUE FALSE FALSE FALSE FALSE > is.element(vec_chr1, "a") [1] TRUE FALSE TRUE FALSE FALSE |
合計・平均・分散
ベクトルの合計・平均・分散を求める関数を紹介します。
次に示すように、関数sum、mean、varを用いることで、簡単にデータの要約を行うことができます。
1 2 3 4 5 6 7 8 9 10 11 | > #合計・平均・分散 > vec7 <- c(290, 300, 270, 320, 330, 350) > > sum_vec7 <- sum(vec7) #合計 > mean_vec7 <- mean(vec7) #平均 > var_vec7 <- var(vec7) #分散 > > summaryStats <- c(sum = sum_vec7, mean = mean_vec7, var = var_vec7) > summaryStats sum mean var 1860 310 840 |
度数表の作成
ベクトルの要素の数を計算する関数と実行例について見ていきます。
関数tableによりベクトルの度数を計算することができます。
1 2 3 4 5 6 7 | > #度数表 > vec6 <- c("A", "B", "B", "A", "C", "A", "C", "B", "A", "A") > > table(vec6) #度数表 vec6 A B C 5 3 2 |
ベクトルのファイルへの保存
最後にベクトルをtxtファイルやcsvファイルに保存する例を紹介します。
関数write.tableやwrite.csvでtxtファイルやcsvファイルにベクトルのデータを出力することができます。
ベクトルをそのまま関数に渡すと下の画像のように縦方向に要素が出力されます。
要素を横に並べて出力したいときは、関数tを使ってベクトルを転置しましょう。
1 2 3 4 5 6 7 | #ベクトルの保存 #txtファイル write.table(vec1, "ベクトル操作.txt", quote = FALSE) #要素を縦に出力 write.table(t(vec1), "ベクトル操作.txt", quote = FALSE) #要素を横に出力 #csvファイル write.csv(vec1, "ベクトル操作.csv") |
まとめ
R言語のベクトルの操作方法について見ていきました。
データフレームと同様に、インデックス、名前、真偽値による操作方法があります。
特に真偽値による要素の指定方法ができるようになると、ベクトル単位での演算が可能となるため、インデックスのときよりも実行時間が早くなることがあります。
インデックスでもc(1, 2, 4)のように複数を指定することができますが、特定の要素のみ変えたいときは、条件に合う要素をあらかじめ真偽値で表したほうが扱いやすいです。