ベクトルには要素に名前を付けられます。名前を付けておくと、扱いやすくなることがあります。
ベクトルに名前を付ける方法は3つあります。
> work_days <- c(Mon = TRUE, Tue = TRUE, Wed = TRUE, Thu = TRUE, Fri = TRUE, Sat = FALSE, Sun = FALSE)
> work_days
Mon Tue Wed Thu Fri Sat Sun
TRUE TRUE TRUE TRUE TRUE FALSE FALSE
names()に文字列のベクトルを代入する> months <- c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
> names(months) <- month.abb
> months
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
31 28 31 30 31 30 31 31 30 31 30 31
setNames()を使う> months <- c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
> setNames(months, month.name)
January February March April May June July August September October November December
31 28 31 30 31 30 31 31 30 31 30 31
名前が不要になったら、NULLを設定して削除できます。
> work_days
Mon Tue Wed Thu Fri Sat Sun
TRUE TRUE TRUE TRUE TRUE FALSE FALSE
> names(work_days) <- NULL
> work_days
[1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE
unname()関数を使っても同じ結果になります。こちらのほうが意図が伝わりやすいかもしれません。
names()関数は、名前を設定するだけでなく取得もできます。
> names(months) <- month.abb
> names(months)[1:3]
[1] "Jan" "Feb" "Mar"
位置を表すインデックスの代わりに名前を使うこともできます。この場合は、引用符で囲む必要があります。
> months[c("Jul", "Aug")]
Jul Aug
31 31
このようなインデックス指定を正しく機能させるには、名前が重複しておらず、欠けてもいないことを確かめておくのがよいでしょう。ただし、Rは名前の重複をチェックしません。
通常のベクトル演算はそのまま使えます。名前を残すのが理にかなっている場合は、たいてい名前も保持されます。
> months[months == 30]
Apr Jun Sep Nov
30 30 30 30
> sum(months)
[1] 365 # no meaningful names possible
vectorsをはじめとする多くのRのオブジェクトには、任意の属性を付けることができます。names属性はその一例にすぎませんが、とくによく使われ、重要なものです。
実際のところ、名前はベクトルでは役に立つこともありますが、必須になることはほとんどありません。names-attribute属性は、listsやdataframesのようなより複雑な構造では、はるかに重要になります。これは今後のコンセプトで見ていきます。