ベクトルデータに対して、[]
演算子を使ってインデックスベクトル (Index Vector) を指定すると、そのベクトルの要素を特定の条件で組み合わせたベクトルを作成することができます。
インデックスベクトルに指定するベクトルの型により、動作が変わります。
1 〜 length(x)
の範囲の数値で構成されるベクトル)を指定した場合
TRUE
, FALSE
で構成されるベクトル)を指定した場合
TRUE
になる位置の要素のみで構成されたベクトルを作成(フィルタ)下記は、数値ベクトルを渡し、その指定した位置の要素から構成されるベクトルを作成しています。
> x <- c('A', 'B', 'C')
> x[c(1, 2, 3, 2, 1)]
[1] "A" "B" "C" "B" "A"
多くの言語の配列と同様なインデックスアクセスや、配列スライシングできるのはこの仕組みによります。
> x <- c('A', 'B', 'C')
> x[2]
[1] "B"
> x <- c('A', 'B', 'C')
> x[2:3]
[1] "B" "C"
範囲外のインデックスを指定すると、その位置の要素は NA
になります。
> x <- c('A', 'B', 'C')
> x[1:5]
[1] "A" "B" "C" NA NA
数値ベクトルを作成する関数を組み合わせて使用すれば、柔軟なベクトル作成を行うことができます。
> x <- c('A', 'B', 'C')
> x[rep(c(1, 2, 2), times=3)]
[1] "A" "B" "B" "A" "B" "B" "A" "B" "B"
負の数値からなる数値ベクトルを渡すと、その位置の要素を削除したベクトルを作成することができます。次の例では、2 番目と、3 番目の要素を削除したベクトルを作成しています。
> x <- 1:5
> x[c(-2, -3)]
[1] 1 4 5
下記は、論理ベクトルを指定する例です。偶数の数値にフィルタしたベクトルを作成しています。
> x <- c(4, 7, 3, 2, 6)
> x[x%%2 == 0]
[1] 4 2 6
内部的には X%%2==0
というところで、以下のような TRUE
と FALSE
から成る論理ベクトルを作成しています。
TRUE FALSE FALSE TRUE TRUE
このベクトルの要素が TRUE
になる位置(偶数)のみの要素を抽出していることになります。