R言語のベクトルの操作(作成や参照、代入、要素の追加など)をまとめました。
この記事では以下のベクトルに関する操作を実行例付きで分かりやすく解説しています。
この記事で学べる事
- ベクトルの作成
- ベクトルの参照
- ベクトルの要素の取得
- ベクトルの要素の変更
- 名前の変更
- 要素の追加・挿入・削除
- ベクトルの結合
- ベクトルの並び替え・ソート
- 欠測値の処理
- ベクトルの型(type)の変更
- ベクトルの演算
- ベクトルを用いた集合演算
- 行と列の合計・平均・分散
- ベクトルの度数表を作成
- ベクトルのファイルへの保存
データ解析で必要不可欠なベクトル(vector)の基本操作のほとんどをマスターすることができます。
この記事で扱うプログラミングコードは以下からダウンロードできます。
テンプレートとして使っていただいて構いません。
R言語 ベクトル操作
また、データフレームの操作方法については次の記事で解説しています。
【R言語】データフレーム操作 作成・値の代入・行と列の追加と削除など
R言語を使う際に避けては通れない道であるデータフレームの操作について解説します。 データフレーム(data.frame)はデータセットを格納するための行列であり、データ解析をするうえで必要不可欠です。 ...
続きを見る
この記事は複数のページで構成されています。
各ページの内容
- 1ページ目でベクトルの作成、参照、要素の取得、要素の変更、名前の付与と変更
- 2ページ目でベクトルの要素の追加と削除、ベクトルの結合、並び替えとソート、欠測値の処理、ベクトルの型の変更、ベクトルの演算、集合演算、合計・平均・分散の計算、度数表、ベクトルの保存
を扱っています。
ベクトルの作成
ベクトルを作成するには関数cを用います。
関数cの引数に要素をカンマ「,」区切りで渡すことで、その引数を要素に持つベクトルを作成することができます。
下の例のようにnumeric型、character型、logical型の要素を持つベクトルを作成することができます。
注意として、ベクトルの要素は全て同じである必要があるため、numeric型とcharacter型が混ざったものは作成できません。
引数を指定せずに実行すると2行目のように要素を持たないNULLが生成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | > #ベクトルの作成 > vec0 <- c() #NULL(要素無し) > vec0 NULL > > vec1 <- c(1, 2, 3, 4, 5) #numeric型のベクトル > vec1 [1] 1 2 3 4 5 > > vec2 <- c("a", "b", "c", "d", "e") #character型のベクトル > vec2 [1] "a" "b" "c" "d" "e" > > vec3 <- c(TRUE, FALSE) #logical型のベクトル > vec3 [1] TRUE FALSE |
ベクトルの参照
続いてベクトルの参照方法について見ていきます。
次のように関数head、tailによってベクトルの先頭部分、末尾部分を参照することができます。
ベクトルの要素が多いときにどのような値を持つのか確認したいときに便利です。
1 2 3 4 5 6 7 8 9 10 | > #ベクトルの参照 > vec1 <- c(A = 1, B = 2, C = 3, D = 4, E = 5, F = 6, G = 7, H = 8, I = 9, J = 10) > > head(vec1) #先頭 A B C D E F 1 2 3 4 5 6 > > tail(vec1) #末尾 E F G H I J 5 6 7 8 9 10 |
また、次のように引数nを渡すことで何個目までを表示するか指定することができます。
1 2 3 | > head(vec1, 3) #位置を指定 A B C 1 2 3 |
ベクトルの名前(names)を参照したいときは、関数namesを用います。
関数namesの引数に名前を参照したいベクトルを渡すことで、ベクトルの名前を参照することができます。
1 2 | > names(vec1) #名前 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" |
ベクトルの要素の取得
ベクトルの要素の取得方法をいくつかに分けてみていきます。
この後の要素の変更でも触れますが、次の3つの方法で要素の取得が可能です。
- インデックスで指定する方法
- 名前で指定する方法
- 真偽値で指定する方法
3つの方法の利点とともに要素の取得の仕方を説明していきます。
インデックスで指定
まず、インデックスで指定する方法について見ていきます。
インデックスで指定して要素を取得する方法は以下の通りです。
- 1番目の要素を取得したいときは、vec[1]
- 1番目と3番目の要素を取得したいときは、vec[c(1, 3)]
- 2から4番目の要素を取得したいときは、vec[seq(2, 4)]
実行例にあるように、ベクトルの後ろに大括弧[index]を付けることで、index番目の要素を取得することができます。
c(1, 3)のようにベクトルのインデックスを与えてあげると、複数の要素を取得することもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 > > vec1[1] #1番目の要素 A 1 > > vec1[c(1, 3)] #1、3番目の要素 A C 1 3 > > vec1[seq(2, 4)] #2から3番目の要素 B C D 2 3 4 |
インデックスで取得する方法は、例えばfor文でインデックスを繰り返したいときに用いられます。
また、単に1番目、2番目の要素を取得したいときにvec[1]、vec[2]と書いてもいいですが、マジックナンバーだらけになってしまいプログラミングコードの質的に良くないです。
数日たった後に何の解析をしていたのか分からなくなってしまうため、このようなインデックスで参照する方法を多用するのはお勧めしません。
インデックスにこだわらない場合は、この後に解説する「名前で取得する方法」と「真偽値で取得する方法」を使いましょう。
名前で指定
次に名前で指定する方法を紹介します。
ベクトルに名前(names)がある場合は名前を指定することで、その名前に対応する要素を取得することができます。
以下のようにして、名前でベクトルの要素を参照できます。
- 名前が"A"である要素を取得したいときは、vec["A"]
- 名前が"B"、"D"である要素を取得したいときは、vec[c("B", "D")]
インデックスのときと同様に、大括弧の中に名前のベクトルを渡すことで複数を取得することができます。
1 2 3 4 5 6 7 | > vec1["A"] #名前がAである要素 A 1 > > vec1[c("B", "D")] #名前がB、Dである要素 B D 2 4 |
真偽値で指定
最後に真偽値で要素を取得する方法について見ていきます。
logical型のベクトルをベクトルの後ろの大括弧に渡すことで、TRUEに対応する要素を取得することができます。
例えば、「numeric型のベクトルのうち10以上の要素のみ取得したい」というときに役立ちます。
- 10以上の要素を取得したいときは、vec[vec >= 10]
- 名前が"A"または"D"である要素を取得したいときは、vec[names(vec) == "A" | names(vec) == "D"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | > vec1[c("B", "D")] #名前がB、Dである要素 B D 2 4 > #真偽値で取得 > vec1[c(TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)] A C D H J 1 3 4 8 10 > > vec1[vec1 >= 10] #10以上である要素 J 10 > > vec1[names(vec1) == "A"| names(vec1) == "D"] #名前がAまたはDの要素 A D 1 4 |
ベクトルの要素の変更
続いてベクトルの要素の変更について解説します。
ベクトルの要素の取得と同様に、変更方法はインデックス、名前、真偽値の3通りあります。
それぞれの変更方法について見ていきます。
インデックスで指定
最初に一番基本的なインデックスで要素を変更する方法を紹介します。
「先頭から10番目の要素を変更したい」というときに役立ちます。
- 1番目の要素を-1にしたいときは、vec[1] <- -1
- 2と3番目の要素をそれぞれ-2、-3にしたいときは、vec[c(2, 3)] <- c(-2, -3)
1 2 3 4 5 6 7 8 9 10 11 12 13 | > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 > > vec1[1] <- -1 #1つ目の要素 > vec1 A B C D E F G H I J -1 2 3 4 5 6 7 8 9 10 > > vec1[c(2, 3)] <- c(-2, -3) #2、3つ目の要素 > vec1 A B C D E F G H I J -1 -2 -3 4 5 6 7 8 9 10 |
要素の取得で説明したように、このインデックスで要素の変更方法をあまり使わないようにコーディングするのが鉄則です。
名前で指定
名前で要素を変更する例を紹介します。
ベクトルに名前が与えられているときは、名前に対応する要素を変更することができます。
- 名前が"A"である要素を0にしたいときは、vec["A"] <- 0
- 名前が"B"、"D"である要素を0にしたいときは、vec[c("B", "D")] <- 0
1 2 3 4 5 6 7 8 9 | > vec1["A"] <- 0 #名前がAである要素 > vec1 A B C D E F G H I J 0 -2 -3 4 5 6 7 8 9 10 > > vec1[c("B", "D")] <- 0 #名前がB、Dである要素 > vec1 A B C D E F G H I J 0 0 -3 0 5 6 7 8 9 10 |
真偽値で指定
真偽値での要素を変更は「10以上の要素を飲み変更したい」、「ある要素に一致するもののみ変更したい」ときに役立ちます。
下に示すような要素の変更ができます。
- 0である要素を-1に変更したいときは、vec[vec == 0] <- -1
- 6以上である要素を0に変更したいときは、vec[vec >= 6] <- 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | > #真偽値で代入 > vec1[c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE)] <- seq_len(5) > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 > > vec1[vec1 == 0] <- -1 #0である要素 > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 > > vec1[vec1 >= 6] <- 0 #10以上である要素 > vec1 A B C D E F G H I J 1 2 3 4 5 0 0 0 0 0 > > vec1[names(vec1) == "A"| names(vec1) >= "F"] <- c(1, 6, 7, 8, 9, 10) #名前がAまたはF以上の要素 > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 |
ベクトルの名前の付与・変更
次にベクトルの名前の与え方と変更の仕方について紹介します。
名前の付与
ベクトルに名前を付けたいときは次のように関数namesを使う方法と、関数cで直接名前を与える方法があります。
例えば、ベクトルvecの名前をc("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")にしたいときは次のようにします。
- names(vec) <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
- vec <- c(A = 1, B = 2, C = 3, D = 4, E = 5, F = 6, G = 7, H = 8, I = 9, J = 10)
関数cで与える方法を使う場合、16行目のように""で囲んでいないと+や-などの特殊文字を使うことができないのに注意が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | > #名前の付け方・変更 > vec1 <- seq_len(10) > vec1 [1] 1 2 3 4 5 6 7 8 9 10 > > names(vec1) <- LETTERS[seq_len(10)] > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 > > vec1 <- c(A = 1, B = 2, C = 3, D = 4, E = 5, F = 6, G = 7, H = 8, I = 9, J = 10) > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 > > vec1 <- c("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10) > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 |
名前の変更
次にベクトルの名前の変更方法を紹介します。
ベクトルの変更はインデックスによるものと名前(真偽値)による方法があります。
インデックスで指定
下の実行例に示すように、ベクトルの要素の変更と同様にベクトルの要素をインデックスで指定して変更することができます。
- 1番目の名前を"a"にしたいときは、names(vec)[1] <- "a"
- 2と3番目の名前を"b"、"c"にしたいときは、names(vec)[c(2, 3)] <- c("b", "c")
1 2 3 4 5 6 7 8 9 | > names(vec1)[1] <- "a" #1番目の名前の変更 > vec1 a B C D E F G H I J 0 0 -3 0 5 6 7 8 9 10 > > names(vec1)[c(2, 3)] <- c("b", "c") #2と3番目の名前の変更 > vec1 a b c D E F G H I J 0 0 -3 0 5 6 7 8 9 10 |
名前で指定(真偽値で指定)
次に名前で指定してベクトルの名前を変更する方法を紹介します。
先頭から5番目の名前を変更するよりは、名前で指定して変更する方がより自然でコードも読みやすくなります。
次のようにある名前に一致するような条件(真偽値)を大括弧に渡すことで名前を変更することができます。
- 名前"a"を変更を"A"に変更したいときは、names(vec)[names(vec) == "a"] <- "A"
- 名前"b"と"c"を変更を"B"と"C"に変更したいときは、names(vec)[names(vec) %in% c("b", "c")] <- c("B", "C")
1 2 3 4 5 6 7 8 9 10 | > #名前で変更(真偽値で変更) > names(vec1)[names(vec1) == "a"] <- "A" #名前"a"を変更 > vec1 A b c D E F G H I J 1 2 3 4 5 6 7 8 9 10 > > names(vec1)[names(vec1) %in% c("b", "c")] <- c("B", "C") #名前"b"と"c"を変更 > vec1 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 |