3.3 変数(Variables)
R での変数の扱い方について触れておきます。まず、変数名の命名規則ですが スタイルガイド に準拠して「英小文字、数字、アンダースコア」のみを使うことを推奨します。また、変数名は分かりやすい名称にするように心掛けてください。例えば
<- 10L
number_int number_int
## [1] 10
なお、数字から始まる変数名は R の仕様により使用することができません。
<- 100
1num <- "foo" 2_string
## Error: <text>:1:2: 想定外のシンボルです
## 1: 1num
## ^
また、予約語以外でも変数型や関数に使われているような名前を変数名にすることはおすゝめできません。
3.3.1 データ型
他の言語でも同じですが変数には値を入れることができます。データ型はどのような値(データ)が入っているかを識別するためのものです。R の代表的なデータ型には以下のようなものがあります。
型 | クラス | タイプ | モード | 格納モード | 備考 |
---|---|---|---|---|---|
実数型 | numeric |
double |
numeric |
double |
倍精度浮動小数点 |
整数型 | integer |
integer |
numeric |
integer |
|
複素数型 | complex |
complex |
complex |
complex |
|
論理型 | logical |
logical |
logical |
logical |
Boolean型 |
文字型 | character |
character |
character |
character |
|
日付型 | Date |
double |
numeric |
double |
Date型(POSIX型もあり) |
R は開発の経緯から様々な型の見かたがありますが、基本的に同じようなものだとと考えてください。書籍などでよく出てくる str
(structure)関数が返す型は上表におけるクラスです。
3.3.2 変数型
前述のようなデータ型を持った値を入れる箱が変数です。変数には華表のような様々な形があります。中でも表形式のデータを扱えるデータフレーム型は R ならではの変数型といえます。また、R には他の言語ではよく見かけるスカラー型(一種類のデータ型の値を一つだけ格納できる変数型)はありません基本となる変数型はベクトル型になります。
変数型にもクラスがありますが、ベクトル型変数のクラスはデータ型のクラスと同じです。
変数の型 | クラス | 説明 |
---|---|---|
ベクトル型 | データ型に同じ | 一種類のデータ型の値を任意の個数だけ格納できる変数型 |
因子型 | factor , ordered |
水準インデックスを持ったベクトル型変数 |
マトリクス型(行列型) | matrix |
二次元型の変数型(ベクトル型とは異なる型) |
アレイ型(配列型) | array |
多次元型の変数(ベクトル型とは異なる型) |
データフレーム型 | data.frame |
データ型の異なる複数の等長ベクトル型を格納できる変数型 |
リスト型 | list |
データ型の異なる複数のベクトル型変数を格納できる変数型 |
3.3.3 ベクトル型
ベクトル型は前述のように最も基本となる変数型です。ベクトル型変数を作成するには c
関数使います。代入して str
関数でクラス、長さ(値の個数)と値を確認してみます。
長さが \(1\) の場合は c
関数を省略できます。
<- 2L # 一つだけ代入(格納)する場合 `c` は省略可能です
x str(x) # 値が一つだけの場合は長さ表示が省略されます
## int 2
<- c(1, 2, 3) # 実数の 1 から 3 の三つの値が代入されます
x str(x) # []の部分が長さ表示です
## num [1:3] 1 2 3
文字(型)を代入する場合はクォート(ダブルまはたシングル)で囲みます。
<- c("1", '2', "3") # 文字として数字を代入してみます
x str(x)
## chr [1:3] "1" "2" "3"
では文字(型)と数字(型)を混在させたらどうなるでしょう?
<- c(1L, 2, "3") # 整数、実数、文字としての数字を代入してみます
x str(x) # 強制型変換により最も柔軟度の高い文字型になります
## chr [1:3] "1" "2" "3"
エラーにはならずベクトル型変数は文字型クラスとして作成されます。これは強制型変換という処理が行われるためです。強制型変換は複数のデータ型が混在した場合により柔軟度の高いデータ型に変換する処理です。論理型、整数型、実数型、複素数型、文字型の順に変換されます。
便利ではありますが意図しない結果を招く可能性がありますので、このような変換があることは覚えておいてください。
3.3.4 因子型
因子型は名義尺度や順序尺度の変数を扱うのに便利な変数型です。因子型を作成するには factor
関数を使う順序なしの因子型と ordered
関数を使う順序ありの因子型があります。どちらも levels
(水準) という属性がついているベクトル型です。
後述のデータフレーム型の中で使うと「層別」という処理が楽になります。
<- factor(c("A", "B", "AB", "O", "A", "A", "A", "B"))
x str(x)
## Factor w/ 4 levels "A","AB","B","O": 1 3 2 4 1 1 1 3
levels(x)
## [1] "A" "AB" "B" "O"
ordered
型は levels
に順序がついている点が factor
型と異なる点です。
<- ordered(c("A", "B", "AB", "O", "A", "A", "A", "B"))
x str(x)
## Ord.factor w/ 4 levels "A"<"AB"<"B"<"O": 1 3 2 4 1 1 1 3
levels(x)
## [1] "A" "AB" "B" "O"
3.3.5 マトリクス型
マトリクス型は文字通り二次元配列を扱うための変数型です。作成するには matrix
関数を利用します。引数のベクトル型を列方向から二次元に展開します。
展開方向を変えるには byrow
オプションを指定します。
数値だけでなく文字列も扱えます。
3.3.6 アレイ型
アレイ型は多次元配列を扱うのに便利な変数型です。作成するには array
関数を利用します。第一引数で指定したベクトル型のデータを第二引数で指定した構造(行, 列, 次元)にしたがって展開します。
展開は列方向のみで matrix
型にある byrow
オプションはありません。また、第一引数のデータ数が足りない場合は先頭からリサイクルして展開します。
array(c(1:12), c(2, 3, 2))
## , , 1
##
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 7 9 11
## [2,] 8 10 12
3.3.7 データフレーム型
データフレーム型は表形式のデータを扱うのに非常に便利な変数型です。列ごとに異なるデータ型の変数を格納することが可能ですので、データベースのテーブルのようなものです。ただし、全ての列において行数が同一でなければなりません。データフレーム型を作成するには data.frame
関数を用います。
<- data.frame(col1 = c(1:5), col2 = c("A", "B", "C", "D", "E"),
x col3 = c(10, 11, 12, 13, 14), col4 = c(TRUE, TRUE, FALSE, TRUE, FALSE))
str(x)
## 'data.frame': 5 obs. of 4 variables:
## $ col1: int 1 2 3 4 5
## $ col2: chr "A" "B" "C" "D" ...
## $ col3: num 10 11 12 13 14
## $ col4: logi TRUE TRUE FALSE TRUE FALSE
x
データフレーム型は列名を指定することが可能です。また、文字型のデータはデフォルトで因子型変数として扱われます。
3.3.8 リスト型
リスト型はデータフレーム型とは異なり不等長のベクトル型変数を格納できる変数型です。ベクトル型の他にもマトリクス型やデータフレーム型、リスト型地震を格納できる非常に柔軟な構造であるため様々な関数あが返り値と使っています。
<- list(c(1:10), c(0.5:5.5), seq(1, 4, 0.2), c("A", "B", "AB", "O"), x)
x str(x)
## List of 5
## $ : int [1:10] 1 2 3 4 5 6 7 8 9 10
## $ : num [1:6] 0.5 1.5 2.5 3.5 4.5 5.5
## $ : num [1:16] 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 ...
## $ : chr [1:4] "A" "B" "AB" "O"
## $ :'data.frame': 5 obs. of 4 variables:
## ..$ col1: int [1:5] 1 2 3 4 5
## ..$ col2: chr [1:5] "A" "B" "C" "D" ...
## ..$ col3: num [1:5] 10 11 12 13 14
## ..$ col4: logi [1:5] TRUE TRUE FALSE TRUE FALSE
x
## [[1]]
## [1] 1 2 3 4 5 6 7 8 9 10
##
## [[2]]
## [1] 0.5 1.5 2.5 3.5 4.5 5.5
##
## [[3]]
## [1] 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8 4.0
##
## [[4]]
## [1] "A" "B" "AB" "O"
##
## [[5]]
## col1 col2 col3 col4
## 1 1 A 10 TRUE
## 2 2 B 11 TRUE
## 3 3 C 12 FALSE
## 4 4 D 13 TRUE
## 5 5 E 14 FALSE