こんにちは,shun(@datasciencemore)です!!
前回はデータ型についてやりましたね,覚えているでしょうか?
今回はベクトルについてやっていきます.
前回のデータ型がわからないとよく理解できないと思いますので,必要な方は復習をお願いします.
目次
1.ベクトルってなに??
ベクトルってのは,同じデータ型のデータをひとまとめにした集合体のことだよ!!
高校でベクトルは向きと大きさを持ったものと習ったと思います.
その理解は間違いではないですが,Rではもっと単純にただ同じデータ型が集まっているんだと考えたほうがスムーズに理解できます.
以下に長さ5でinteger型,character型,logical型のベクトルのイメージを示します.
ベクトルの長さというのは,データが格納されている個数のことです.
1 2 |
# int型長さ5のベクトル c(1, 5, 8, 13, 4) |
1 |
[1] 1 5 8 13 4 |
1 2 |
# chr型長さ5のベクトル c("a", "B", "CD", "EFg", "hiJK") |
1 |
[1] "a" "B" "CD" "EFg" "hiJK" |
1 2 |
# lgl型長さ5のベクトル c(TRUE, TRUE, FALSE, TRUE, FALSE) |
1 |
[1] TRUE TRUE FALSE TRUE FALSE |
簡単ですね!
これらのベクトルについて,いろいろ知っておく必要があります.
次章からそれぞれ見ていきましょう.
2.ベクトルの四則演算
ベクトルは同じ型と長さであれば,四則演算できます.
例えば,int型で長さ5のベクトル同士を足してみましょう
1 2 3 4 5 |
# int型長さ5のベクトルを足す int_a = c(1, 5, 8, 13, 4) int_b = c(2, 3, 5, 10, 98) int_a + int_b |
1 |
[1] 3 8 13 23 102 |
このように同じインデックスのところで足し算が行われます.
イメージはこんな感じ
さっきの図とは違って,ベクトルの向きが縦ですね.
実はベクトルは縦ベクトルと横ベクトルがあります.
縦でも横でも計算方法は一緒なので,両方慣れてください.
どちらを使うかは,その時次第で便利なほうを使用します.
ただ,一般的にベクトルって言われたら縦ベクトルを思い描いたほうがいいことが多いような気がします(ただの主観笑)
1 2 3 4 5 |
# chr型長さ5のベクトルを足す chr_a = c("a", "B", "CD", "EFg", "hiJK") chr_b = c("C", "E", "ai", "q", "y") chr_a + chr_b |
1 |
Error in chr_a + chr_b : non-numeric argument to binary operator |
ありゃりゃ,エラーが出てしまいましたね.
chr型同士の足し算はRでは定義できないのでエラーになります.
定義できなければ当然計算できません.
ちなみにPythonはstr型同士を足すことができますよね.
Pythonに慣れている人は注意してくださいね.
どうなると思いますか?
残念!
実は計算できるんだ!
1 2 3 4 5 |
# lgl型長さ5のベクトルを足す lgl_a = c(TRUE, TRUE, FALSE, TRUE, FALSE) lgl_b = c(FALSE, TRUE, TRUE, FALSE, TRUE) lgl_a + lgl_b |
1 2 |
> lgl_a + lgl_b [1] 1 2 1 1 1 |
はい,できました!
実はlgl型は,TRUEを1,FALSEを0とコンピュータは裏で認識しているのです.
そのため,足し算は定義できるので,ちゃんと計算ができたのです.
今回の場合は, lgl_a = c(1, 1, 0, 1, 0) lgl_b = c(0, 1, 1, 0, 1) とコンピュータが裏で認識しているので,これらを足すと 1, 2, 1, 1, 1 となるのですね.
3.ベクトルのリサイクル
先ほど2つのベクトルを足す際,データ型と長さが同じである必要があると説明しました.
それでは,次のようなベクトル同士を足せるでしょうか?
長さが違うから足せませんね.
だって,1つ目のベクトルの3番目と4番目の要素に足す数字がないですから.
これ,計算できなさそうなんだけど,実は計算できるんだ!
2番目のベクトルは,リサイクルという機能をつかって,自動的に長さを調節してるんだよ!!
リサイクルとはいったいどのような機能なのでしょうか?
以下の図をみてみましょう.
そう,リサイクルというのは,足りない部分に対して,上のベクトルを使用して自動的に補完してくれる機能なんです.
実際にRのコードを打って確認してみましょう.
1 2 |
# ベクトルのリサイクル c(1, 5, 8, 13) + c(2, 3) |
1 |
[1] 3 8 10 16 |
ちゃんと計算できましたね.
c(2, 3)というベクトルがリサイクルされて,実際はc(2, 3, 2, 3)というベクトルになっているため,うまく計算できたのです.
そう,便利です!
ただ,注意しないといけないこともあるんだ!
さて,何を注意する必要があるのでしょうか?
先ほどの挙げたリサイクルの例では,足りない部分の長さが2で,補完元のベクトルの長さも2であったので,きれいに収まりました.
もし,足りない部分の長さが1で補完元のベクトルの長さが3であったら,どのようにリサイクルされるのでしょうか?
以下の図を見てみましょう.
1つの足りない部分に対し,補完元のベクトルの長さは3ですから,うまく収まりませんね.
このような場合,上から必要な要素だけ補完に使用し,残りの要素については削除されます.
この例の場合,2が補完に使用され,残りの3,9は削除されるのです.
実際にRでコーディングしてみましょう.
1 2 |
<code># ベクトルのリサイクル うまく収まらない場合 c(1, 5, 8, 13) + c(2, 3, 1)</code> |
1 2 3 4 |
[1] 3 8 9 15 Warning message: In c(1, 5, 8, 13) + c(2, 3, 1) : longer object length is not a multiple of shorter object length |
計算できました!
c(2, 3, 1)というベクトルは,リサイクルされてc(2, 3, 1, 2)になりますから,計算結果は,c(3, 8, 9, 15)となりますから,あっていますね.
ただ,出力結果の後がさきほどと少し出力が違いますね.
Warning messageというのが出力されています.
これは,さきほどまさに説明したうまく収まっていないということをRが教えてくれているのです.
こんな感じで,リサイクル時に消えてしまう要素があることを注意してリサイクル機能を使用してくださいね.
4.ベクトルの要素抽出
[]で要素の位置を指定すると指定した要素を抽出することができます.
要素の位置を指定する方法は,全部で3つあります.
- インデックスで指定する.
- 名前で指定する.
- 論理値で指定する.
順番に見ていきましょう.
4.1.インデックスで指定する.
抽出したい要素のインデックスを指定します.
Rのインデックスは,ベクトルの先頭を1として,以降1ずつ増えていきます.
1 2 |
# ベクトルの定義 vec = c(1, 5, 8, 13, 4) |
1 2 |
# 3番目を抽出 vec[3] |
1 |
[1] 8 |
複数の要素を指定することも可能です.
その場合,ベクトルでインデックスを指定します.
1 2 |
# 2番目と4番目を抽出 vec[c(2, 4)] |
1 |
[1] 5 13 |
インデックスにー(マイナス)をつけると,そのインデックスは抽出されません.
1 2 |
# 1番目,3番目以外を抽出 vec[c(-1, -3)] |
1 |
[1] 5 13 4 |
Rでは,先頭のインデックスは1ですが,Pythonは0です.
Pythonに慣れている方は注意してくださいね.また,ーを指定した時の挙動もRとPythonで違うので,ご注意を...
4.2.名前で指定する.
実は,ベクトルの各要素に名前を付けることができます.
名前を付けるといろいろ便利なことができるようになります.
それらの中の1つがこの名前で要素を指定することです.
早速やってみましょう.
1 2 |
# 名前付きベクトルの定義 vec = c("one" = 1, "two"= 5,"three" = 8, "four" = 13, "five" = 4) |
1 2 |
# "one"と"three"を抽出 vec[c("one", "three")] |
1 2 |
one three 1 8 |
4.3.論理値で指定する.
論理値で指定して要素を抽出することもできます.
要素を抽出したいベクトルと同じ長さの論理値ベクトルを指定すると,TRUEのところだけ抽出されます.
1 2 |
# ベクトルの定義 vec = c(1, 5, 8, 13, 4) |
1 2 |
# 1番目と3番目と4番目を抽出 vec[c(TRUE, FALSE, TRUE, TRUE, FALSE)] |
1 |
[1] 1 8 13 |
これは,条件を満たした要素を抽出する場合に便利です.
1 2 |
# 5以上の要素を抽出 vec[vec >= 5] |
1 |
[1] 5 8 13 |
以下の処理で5以上の要素が抽出されます.
- vec >= 5の部分で,論理値ベクトルc(FALSE, TRUE, TRUE, TRUE, FALSE)が返却される.
- 論理値ベクトルc(FALSE, TRUE, TRUE, TRUE, FALSE)のTRUEの部分が抽出される.
条件については,詳細に別記事にまとめる予定です. 今はなんとなく理解いただければOKです.
追記)条件についてこちらに書きました!
5.ベクトルの便利関数
Rにはデフォルトで使える便利関数がいくつもあります.
その中で特によく使う関数を以下に挙げます.
一例を以下に挙げます.
1 2 |
# ベクトルの定義 vec = c(1, 5, 8, 13, 4) |
1 2 |
# ベクトルの総和 sum(vec) |
1 |
[1] 31 |
1 2 |
# ベクトルの平均 mean(vec) |
1 |
[1] 6.2 |
1 2 |
# ベクトルのクォンタイル quantile(vec) |
1 2 |
0% 25% 50% 75% 100% 1 4 5 8 13 |
1 2 |
# ベクトルの分散 var(vec) |
1 |
[1] 20.7 |
クォンタイルとか分散とか標準偏差とかの用語は今はわからなくて結構です.
ちなみに,正確にいうと分散は不偏分散を,標準偏差は,不偏分散の平方根を表しています
実は,lgl型のベクトルに対して,sumとmeanを使うと,ベクトル内のTRUEの数と割合がわかります.
これは,先ほどの【2.ベクトルの四則演算】でさりげなくやったとおり,コンピュータが裏でTRUEを1,FALSEを0と認識しているからです.
1 2 |
# lgl型のベクトルの定義 lgl_vec = c(TRUE, TRUE, FALSE, FALSE, TRUE) |
1 2 |
# sumでTRUEの個数を取得 sum(lgl_vec) |
1 |
[1] 3 |
1 2 |
# meanでTRUEの割合を取得 mean(lgl_vec) |
1 |
[1] 0.6 |
これ,かなり便利でよく使いますのでぜひ覚えてください.
6.規則的なベクトルの作成
Rでは,規則的なベクトルを簡単に作ることができます.
a, b, nはint型のスカラー,x, y, zはnum型のスカラー,vecはベクトル(データ型はなんでもいい)とします.
これ以外のデータ型でも受け付けるかもしれませんが,あまり使用頻度は高くないので,これ以外のデータ型については気にしなくてOKです.
こういう何言ってるかよくわからない系は実際に自分でコードを打ってどのような出力になるのかを確認するのが一番手っ取り早いです笑
1 2 |
# 1から10まで等差が1の等差ベクトル 1:10 |
1 |
[1] 1 2 3 4 5 6 7 8 9 10 |
1 2 |
# 1.5から10.1までの長さ8の等差ベクトル seq(1.5, 10.1, length = 8) |
1 |
[1] 1.500000 2.728571 3.957143 5.185714 6.414286 7.642857 8.871429 10.100000 |
1 2 |
# 1.5から10.1までの等差が2.5の等差ベクトル seq(1.5, 10.1, by = 2.5) |
1 |
[1] 1.5 4.0 6.5 9.0 |
こんな感じで収まりきらなかった数値はカットされます.
1 2 |
# c("red", "blue", "black")を3回繰り返す rep(c("red", "blue", "black"), times = 3) |
1 |
[1] "red" "blue" "black" "red" "blue" "black" "red" "blue" "black" |
1 2 |
# c("red", "blue", "black")を長さ10になるまで繰り返す. rep(c("red", "blue", "black"), length = 10) |
1 |
[1] "red" "blue" "black" "red" "blue" "black" "red" "blue" "black" "red" |
1 2 |
# c("red", "blue", "black")の要素ごとに5回繰り返す. rep(c("red", "blue", "black"), each = 5) |
1 |
[1] "red" "red" "red" "red" "red" "blue" "blue" "blue" "blue" "blue" "black" "black" "black" "black" "black" |
この中で圧倒的な使用率なのは:ですね.
他のは時々使うかなって感じです.
まとめ
今回はbaseRのベクトルについて,以下のことをやってきました.
- ベクトルってなに??
- ベクトルの四則演算
- ベクトルのリサイクル
- ベクトルの要素抽出
- ベクトルの便利関数
- 規則的なベクトルの作成
いやー,盛りだくさんでしたね!
たくさんありますが,どれも大事なところなので頑張って理解してくださいね.
次回は,論理値ベクトルの処理についてやる予定です.
それでは!!
追記)次回,書きました⇒
-
【R前処理講座7】論理値ベクトルの処理【baseR】
こんにちは,shun(@datasciencemore)です!!前回は,ベクトルについて学びましたね.その中で,論理値ベクトルを使用することでベクトルの要素を抽出できることを覚えているでしょうか?今回 ...
続きを見る