先に触れたように,Rで取り扱うデータにはデータ型(data type)とデータ構造(data structure)があります.ここでは,データ構造について解説します.オブジェクトがデータなどを入れる箱であると見做せるということはすでに解説しましたが,データ構造とはこの箱の形状を意味します.主要なデータ構造としてベクトル(vector),行列(matrix),配列(array),データフレーム(data frame),リスト(list)があります.
ベクトルは1つ以上の要素(element)を一次元に配置したデータ構造です.ただし,ベクトルに含まれるすべての要素は同一のデータ型でなくてはなりません.仮に数値と文字列が混在しているとすると,すべての要素は文字列に変換されます.行列はベクトルを行方向,あるいは列方向に結合した二次元のデータ構造で,矩形データ(rectangular data)を表現するために使用します.Excelなどのスプレッドシートで構築されたデータはおおよそ矩形データに該当します.次に,配列とは行列を重ねた三次元のデータ構造です.行列や配列もベクトルと同様に,単一のデータ型の値しか許容しません.なお,本稿では配列を用いる分析手法を採り上げないため,作成方法等は割愛します.
データフレームは行列を拡張したデータ構造で,列ごとに異なるデータ型を許容します.すなわち,1列目は数値,2列目は文字列,3列目は論理値,というようなデータを構築できます.最後に,リストはあらゆるデータ構造を要素として格納できる柔軟なデータ構造です.様々なオブジェクトを一括管理するために広く利用されます.
また,Rには因子(factor)という特殊なデータ構造があります.これは質的変数を表現するためのデータ構造です.統計学において,質的変数には名義尺度と順序尺度がありますが,Rではそれぞれ順序なし因子(unordered factor)と順序付き因子(ordered factor)となります.順序なし因子および順序付き因子のいずれもRの内部では整数で構成されるベクトルになっており,この整数に質的変数のラベルを対応づけています.実際にRで分析を行うときに,因子がデータ構造であることを意識する場面は少なく,文字列や論理値と同様のデータ型として取り扱っても大きな問題はありません.なお,Rの4.0.0より前のバージョンでは,インポートしたデータに文字列が含まれると自動的に因子に変換されましたが,現行のRでは文字列が強制的に因子に変換されることはありません.古い書籍等を参考にする場合は注意をしてください.
ベクトルはRの基本となるデータ構造です。行列やデータフレームなどを作成するときにもベクトルを利用することが多く,そのためベクトルはとても重要なデータ構造です.ベクトルを作成する関数はc関数です.この c は combine が由来であると言われています.まず,以下では要素の数が5,すなわち長さが5のベクトルを作成し,オブジェクトに代入します.文字列のベクトルを作成するときは,これまでと同様に文字列をダブルクォーテーションで囲みます.もしダブルクォーテーションを付けなければ文字列ではなくオブジェクトと認識されるため注意が必要です.
vec1 <- c(5, 8, 1, 9, 7)
vec1
[1] 5 8 1 9 7
vec2 <- c("a", "d", "c", "b", "a")
vec2
[1] "a" "d" "c" "b" "a"
次に,c関数の括弧の中に数値と文字列が混在した場合を見ていきます.先に述べたように,ベクトルというデータ構造は単一のデータ型しか許容しません.この場合,数値は数字へと変換され,以下のようにすべての要素が文字列に変換されます.数値と数字の見分け方は,出力結果にダブルクォーテーションが付くか否かです.数値はダブルクォーテーションが付きませんが,数字は下記のようにダブルクォーテーションが付きます.
test <- c(1, 2, "a", "b", "c")
test
[1] "1" "2" "a" "b" "c"
この他に,指定した区間内で刻み幅が1となる数値からなるベクトルを作成するとき,いくつか作成方法がありますが,コロンを使用する方法が最も簡単です.この方法は反復処理を実行するときによく使用します.
vec3 <- 1:5
vec3
[1] 1 2 3 4 5
コロンの使用は刻み幅が1に限定されますが,刻み幅が等間隔であるベクトルを作成するときはseq関数を用います.この seq は sequence に由来します.seq関数は第1引数で始めの値,第2引数はベクトルの上限値,第3引数の by で刻み幅を指定します.また,by の代わりに length という引数を使用することもあります.length で指定するのはベクトルの要素の数であり,第1引数と第2引数の範囲内で等間隔になるように,指定した個数の数値からなるベクトルを作成します.
vec4 <- seq(1, 10, by = 3)
vec4
[1] 1 4 7 10
vec4 <- seq(1, 10, length = 4)
vec4
[1] 1 4 7 10
特定の要素,あるいはベクトルを指定した回数だけ複製するための関数にrep関数があります.これは複製を意味する英単語の replicate に由来します.下記の例は,1 から 5 までの整数を3回繰り返すベクトルの作成方法です.rep関数は数値だけではなく文字列や論理値の複製も可能です.なお,引数の "times =" は省略できます.
vec5 <- rep(1:5, times = 3)
vec5
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
vec5 <- rep(vec3, times = 3)
vec5
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
このようにベクトルは複数の要素を一括して管理するためのデータ構造であると言えます.また,データ型の解説において,オブジェクトに1つの数値,あるいは1つの文字列を代入していますが,これは要素数が1のベクトルとなります.
次にベクトルの操作方法を概観します.ベクトルに代入されている特定の要素を参照したいときは,添え字(index)を用いてその要素の番号を指定します.上掲の vec1 を例とすると,vec1 には 5, 8, 1, 9, 7 という5つの要素が代入されています.vec1の 8 という数値を参照したいのであれば、8 は2番目の要素ですので,下記のように添え字を付けます.
vec1[2]
[1] 8
このように,Rでは添え字が1から始まります.他のプログラミング言語は添え字が 0 から始まることもありますので,他のプログラミング言語に慣れ親しんでいる人は注意をしてください.また,複数の要素を参照したいのであれば,c関数を利用して添え字を記述します.例えば,vec2 から1番目と4番目の要素を参照するのであれば,以下のように記述します.
vec2[c(1, 4)]
[1] "a", "b"
以下,作成中.
ああああ
ああああ
ああああ
ああああ