#0. はじめに
前回は単純な四則演算や簡単な変数を扱いました。
今回はもう少し要素を増やし、ベクトルとリストについて扱います。
特にベクトルは頻出ですので、張り切っていきましょう!
【前回の記事はこちら】
##0-1.新しく登場する関数
c()
- 引数の部分の要素をもつベクトルを作ります。
length()
- ベクトル・リストの長さを調べます。
which()
- ベクトル・リストで引数の条件を満たす要素のインデックスを調べます。
##0-2.新しく登場する演算子・記号
- A
==
B - AとBは等しい
- A
>
B - AはBより大きい
- A
:
B - AからBまでの公差1の等差数列
[ ]
- インデックスを指定し、ベクトルの要素を取り出します。
[[ ]]
- インデックスを指定し、リストの要素を取り出します。
#1. ベクトル vector
ベクトルは多数の要素を持たせることができるという強みがあります。統計解析の基本となるベクトルの概念と扱いを押さえましょう。
##1-1. c()
を使ってベクトルを作る
プログラミングにおけるベクトルを知る前に、高校数学でのベクトルを思い出しましょう。
A=(1,1), B=(2,3)のとき
A+B=(1+2, 1+3)=(3,4)
4 B=(42+43)=(8,12)
という計算をしたと思います。
プログラミングにおいても同様のことが可能で、ちょっと違うのは多次元のベクトルを多用する点や数値以外でも可能という点でしょうか。
実際にベクトルを作っていきましょう。
ベクトルを作るためにはc()
を使います。引数に入れたいだけ要素を入れて、,
で区切るだけで完成です。数値だけでなく文字列でもできます。
ベクトルのデータ型は入れた要素のデータ型になります。
ただし、データ型の異なるものを混在させるとあるデータ型に強制変換され、もとのデータ型は失われます。
データ型を忘れてしまった方はこちら
> x<-c(1,2,3,4,5)
> class(x)
[1] "numeric"
> y<-c("mikan","apple","strawberry")
> class(y)
[1] "character"
> z<-c(1,"mikan",2,"apple",3)
#「数値」を入れても、文字列に変換されてしまう。
> z
[1] "1" "mikan" "2" "apple" "3"
> class(z)
[1] "character"
数値を保持しているベクトルは高校数学のような演算が可能です。
ベクトルの長さ(要素数)が異なっても演算が実行されますが、ややこしいので長さはそろえるとよいでしょう。
ベクトルの長さを確認したいときはlength()
関数を使います。
> a<-c(1,2,3,4,5)
> b<-c(10,11,12,13,14
)
#ベクトルの長さを確認
> length(a)
[1] 5
> length(b)
[1] 5
#ベクトルの演算
> 2*a
[1] 2 4 6 8 10
> a+b
[1] 11 13 15 17 19
ベクトルとベクトルをc()
に入れた場合、横長に結合が行われます。
> c(a,b)
[1] 1 2 3 4 5 10 11 12 13 14
##1-2. ベクトルの要素へのアクセス
あるベクトルのn番目の要素を知りたいという場合、変数の後ろに角括弧[]
を付けて指定します。
例えば6番目の要素が知りたいときはこんな感じです。
> a<-c(11,12,13,14,15,16,17,18,19,20)
> a[6]
[1] 16
逆に、16
という要素が何番目か(インデックス)を知りたいときはwhich()
関数を用います。
引数にベクトル名 == 要素
を指定します。
> a<-c(11,12,13,14,15,16,17,18,19,20)
> which(a==16)
[1] 6
#ベクトルaに存在しない要素を指定すると変なのが出てきます。
> which(a==100)
integer(0)
ここでいう==
は「等しい」という条件を示します。イコールが二つ重なっていることに注意です。
他にも>
は数学と同じように「より大きい」という条件を示し、which()
の引数にこれを指定した場合、○○より大きい要素のインデックスを返します。
> a<-c(11,12,13,14,15,16,17,18,19,20)
> which(a>16)
[1] 7 8 9 10
##1-3. 演算子:
演算子:
はベクトルを作る際に便利で、初項と末項を指定すると、公差1の等差数列を作ってくれます。
数値が連続したベクトルを作りたい場合に大活躍です。
> c(2:20)
[1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[18] 19 20
#2. リスト list
ベクトルと似ているようでやや異なる、リストというものがあります。
要素を多数保持できる点はベクトルと共通しますが、
データ型の異なる要素でも収納でき、マトリョーシカ構造をとることができる点が異なります。具体的に見ていきましょう。
##2-1. list()
を使ってリストを作る
リストの作り方は簡単で、ベクトルをc()
で作ったのと同じようにlist()
で作ります。
ベクトルではデータ型の異なる要素を収納することができません。データ型の異なるものを指定すると無理やり何らかのデータ型に統一します。
リストでは、あるデータ型をそのまま保持することが可能です。
ベクトルは完全にみんなを平等に扱うために出る杭は打つタイプ、
リストはみんな違ってみんないい金子みすゞタイプというイメージでしょうか。
#1と2は「数値」として代入したのに” ”がついて「文字列」と変換されてしまいます
> c(1,2,"apple","mikan")
[1] "1" "2" "apple" "mikan"
> list(1,2,"apple","mikan")
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] "apple"
[[4]]
[1] "mikan"
次はリストのマトリョーシカ構造についてみてみましょう。
この記事は生物系向けと銘打っていますので、果物の分類を例にしてみます。
1つ1つの植物種は属という単位でまとめられています。身近な果物だとこんな感じです。
- ナシ属 Pyrus
- ニホンナシ
- セイヨウナシ
- リンゴ属 Malus
- リンゴ
- サクラ属 Prunus
- ウメ
- モモ
- サクランボ
属名を変数名として、それぞれの属の果物をベクトルとして代入します。
> Pyrus<-c("Nihon-nashi","Seiyo-nashi")
> Malus<-c("Ringo")
> Prunus<-c("Ume","Momo","Sakuranbo")
この属名をリストの要素に指定した場合kaneko
と、ベクトルの要素に指定した場合derukui
を比較してみます。
#リストの場合
> kaneko<-list(Pyrus,Malus,Prunus)
> kaneko
[[1]]
[1] "Nihon-nashi" "Seiyo-nashi"
[[2]]
[1] "Ringo"
[[3]]
[1] "Ume" "Momo" "Sakuranbo"
> length(kaneko)
[1] 3
#リストの要素数は3つと判定
#ベクトルの場合
> derukui<-c(Pyrus,Malus,Prunus)
> derukui
[1] "Nihon-nashi" "Seiyo-nashi" "Ringo"
[4] "Ume" "Momo" "Sakuranbo"
> length(derukui)
[1] 6
#ベクトルの要素数は6つと判定
リスト(金子みすゞタイプ)は、属名をありのままの姿で、1つのまとまりとして扱うことができるので、要素としては1つと勘定しますが
ベクトル(出る杭は打つタイプ)は、要素を平等に扱うので、属というまとまりをなくして勘定しています。
##2-2. リストの要素へのアクセス
ベクトルの要素へアクセスするためには[ ]
を使いましたが、リストの場合は2重角括弧[[ ]]
を使います。
前項のkaneko
について、例えばサクラ属Prunus
のまとまりにアクセスしたいときは、Prunus
が3番目の要素であることから3を指定します。
> kaneko[[3]]
[1] "Ume" "Momo" "Sakuranbo"
では、さらにPrunus
の2番目の要素"Momo"
を取り出したいときはどうすればよいでしょう?
先ほど、リストkaneko
からPrunus
を取り出しましたが、このPrunus
自体はリストではなくベクトルということに気づけますでしょうか。
つまり、kaneko
はリストですが、kaneko[[3]]
はベクトルとして扱うことができます。
kaneko[[3]]
を1つのベクトルとして見て[]
を追加することで"Momo"
だけが取り出せます。
> kaneko[[3]][2]
[1] "Momo"