baseR DS講座 tidyverse講座

【R前処理講座6】ベクトル【baseR】

こんにちは,shun(@datasciencemore)です!!

前回はデータ型についてやりましたね,覚えているでしょうか?
今回はベクトルについてやっていきます.
前回のデータ型がわからないとよく理解できないと思いますので,必要な方は復習をお願いします.

1.ベクトルってなに??

ベクトルってなんですか??

ベクトルってのは,同じデータ型のデータをひとまとめにした集合体のことだよ!!

高校でベクトルは向きと大きさを持ったものと習ったと思います.
その理解は間違いではないですが,Rではもっと単純にただ同じデータ型が集まっているんだと考えたほうがスムーズに理解できます.

以下に長さ5でinteger型,character型,logical型のベクトルのイメージを示します.

ベクトルの長さというのは,データが格納されている個数のことです.

これをRで書くにはc()という関数を使用します.

簡単ですね!
これらのベクトルについて,いろいろ知っておく必要があります.
次章からそれぞれ見ていきましょう.

2.ベクトルの四則演算

ベクトルは同じ型と長さであれば,四則演算できます.
例えば,int型で長さ5のベクトル同士を足してみましょう

このように同じインデックスのところで足し算が行われます.
イメージはこんな感じ

さっきの図とは違って,ベクトルの向きが縦ですね.
実はベクトルは縦ベクトルと横ベクトルがあります.
縦でも横でも計算方法は一緒なので,両方慣れてください.
どちらを使うかは,その時次第で便利なほうを使用します.
ただ,一般的にベクトルって言われたら縦ベクトルを思い描いたほうがいいことが多いような気がします(ただの主観笑)

それでは今度は,chr型で長さ5のベクトル同士を足してみましょう.

ありゃりゃ,エラーが出てしまいましたね.
chr型同士の足し算はRでは定義できないのでエラーになります.
定義できなければ当然計算できません.

ちなみにPythonはstr型同士を足すことができますよね.
Pythonに慣れている人は注意してくださいね.

さ,最後にlgl型で長さ5のベクトル同士を足してみましょう.
どうなると思いますか?
TRUE + FALSEなんて計算できないから,chr型と同じでエラーですね!

残念!
実は計算できるんだ!

ほんとにできるのかやってみましょう.

はい,できました!
実は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のコードを打って確認してみましょう.

ちゃんと計算できましたね.
c(2, 3)というベクトルがリサイクルされて,実際はc(2, 3, 2, 3)というベクトルになっているため,うまく計算できたのです.

わー,便利ですね,自動で補完してくれるなんて頭いい♪

そう,便利です!
ただ,注意しないといけないこともあるんだ!

さて,何を注意する必要があるのでしょうか?
先ほどの挙げたリサイクルの例では,足りない部分の長さが2で,補完元のベクトルの長さも2であったので,きれいに収まりました.
もし,足りない部分の長さが1で補完元のベクトルの長さが3であったら,どのようにリサイクルされるのでしょうか?
以下の図を見てみましょう.

1つの足りない部分に対し,補完元のベクトルの長さは3ですから,うまく収まりませんね.
このような場合,上から必要な要素だけ補完に使用し,残りの要素については削除されます.
この例の場合,2が補完に使用され,残りの3,9は削除されるのです.
実際にRでコーディングしてみましょう.

計算できました!
c(2, 3, 1)というベクトルは,リサイクルされてc(2, 3, 1, 2)になりますから,計算結果は,c(3, 8, 9, 15)となりますから,あっていますね.
ただ,出力結果の後がさきほどと少し出力が違いますね.
Warning messageというのが出力されています.
これは,さきほどまさに説明したうまく収まっていないということをRが教えてくれているのです.
こんな感じで,リサイクル時に消えてしまう要素があることを注意してリサイクル機能を使用してくださいね.

4.ベクトルの要素抽出

[]で要素の位置を指定すると指定した要素を抽出することができます.
要素の位置を指定する方法は,全部で3つあります.

  1. インデックスで指定する.
  2. 名前で指定する.
  3. 論理値で指定する.

順番に見ていきましょう.

4.1.インデックスで指定する.

抽出したい要素のインデックスを指定します.
Rのインデックスは,ベクトルの先頭を1として,以降1ずつ増えていきます.

複数の要素を指定することも可能です.
その場合,ベクトルでインデックスを指定します.

インデックスにー(マイナス)をつけると,そのインデックスは抽出されません.

Rでは,先頭のインデックスは1ですが,Pythonは0です.
Pythonに慣れている方は注意してくださいね.また,ーを指定した時の挙動もRとPythonで違うので,ご注意を...

4.2.名前で指定する.

実は,ベクトルの各要素に名前を付けることができます.
名前を付けるといろいろ便利なことができるようになります.
それらの中の1つがこの名前で要素を指定することです.
早速やってみましょう.

4.3.論理値で指定する.

論理値で指定して要素を抽出することもできます.
要素を抽出したいベクトルと同じ長さの論理値ベクトルを指定すると,TRUEのところだけ抽出されます.

これは,条件を満たした要素を抽出する場合に便利です.

以下の処理で5以上の要素が抽出されます.

  1. vec >= 5の部分で,論理値ベクトルc(FALSE, TRUE, TRUE, TRUE, FALSE)が返却される.
  2. 論理値ベクトルc(FALSE, TRUE, TRUE, TRUE, FALSE)のTRUEの部分が抽出される.

条件については,詳細に別記事にまとめる予定です. 今はなんとなく理解いただければOKです.
追記)条件についてこちらに書きました!

5.ベクトルの便利関数

Rにはデフォルトで使える便利関数がいくつもあります.
その中で特によく使う関数を以下に挙げます.

一例を以下に挙げます.

 

 

 

 

 

 

クォンタイルとか分散とか標準偏差とかの用語は今はわからなくて結構です.
ちなみに,正確にいうと分散は不偏分散を,標準偏差は,不偏分散の平方根を表しています

実は,lgl型のベクトルに対して,sumとmeanを使うと,ベクトル内のTRUEの数と割合がわかります.
これは,先ほどの【2.ベクトルの四則演算】でさりげなくやったとおり,コンピュータが裏でTRUEを1,FALSEを0と認識しているからです.

これ,かなり便利でよく使いますのでぜひ覚えてください.

6.規則的なベクトルの作成

Rでは,規則的なベクトルを簡単に作ることができます.

a, b, nはint型のスカラー,x, y, zはnum型のスカラー,vecはベクトル(データ型はなんでもいい)とします.

これ以外のデータ型でも受け付けるかもしれませんが,あまり使用頻度は高くないので,これ以外のデータ型については気にしなくてOKです.

言葉だと何言ってるのかよくわからないので,さっそく例を見てみましょう.
こういう何言ってるかよくわからない系は実際に自分でコードを打ってどのような出力になるのかを確認するのが一番手っ取り早いです笑

こんな感じで収まりきらなかった数値はカットされます.

この中で圧倒的な使用率なのは:ですね.
他のは時々使うかなって感じです.

まとめ

今回はbaseRのベクトルについて,以下のことをやってきました.

  1. ベクトルってなに??
  2. ベクトルの四則演算
  3. ベクトルのリサイクル
  4. ベクトルの要素抽出
  5. ベクトルの便利関数
  6. 規則的なベクトルの作成

いやー,盛りだくさんでしたね!
たくさんありますが,どれも大事なところなので頑張って理解してくださいね.
次回は,論理値ベクトルの処理についてやる予定です.
それでは!!

追記)次回,書きました⇒

【R前処理講座7】論理値ベクトルの処理【baseR】

こんにちは,shun(@datasciencemore)です!!前回は,ベクトルについて学びましたね.その中で,論理値ベクトルを使用することでベクトルの要素を抽出できることを覚えているでしょうか?今回 ...

続きを見る

 

-baseR, DS講座, tidyverse講座