3  Rの基礎

覚えておくべき内容
  1. オブジェクトの作り方
  2. オブジェクトの型
  3. 数値型,文字列,論理型,因子型,行列型,データフレーム型

3.1 Rの基礎

Rの基本的な使い方を学びます。 Rがあつかうデータや分析結果などを格納するため,名前をつけて扱うことができるものを一般にオブジェクト(object)とよびます。 Rでは,オブジェクトの型として,次のようなものがあります。

  • numeric : 実数 (浮動小数点数)
  • character : 文字列
  • logical : 論理値 TRUE または FALSE
  • factor : ファクター型・因子型
  • matrix : 行列
  • data.frame : データフレーム
  • list : リスト
  • NULL : 空のオブジェクト

ここでは,それぞれの型の特徴を簡単に説明します。

3.1.1 変数の代入

オブジェクトに値を代入するには、<-を使います。 xに数値の2を代入してみます。

x <- 2
x
[1] 2

3.1.2 数値型

このxの型を調べるには、class()を使います。

[1] "numeric"

numericと表示され,このオブジェクトxは数値型であることが分かりました。 数値に対しては,四則演算やべき乗などの演算子が使えます。

3.1.3 文字列

文字列を代入する場合は""で囲みます。

y <- "Hello, World!" # 文字列を代入
y # 変数yの値を表示
[1] "Hello, World!"

では、次の場合はどうなるか考えてみてください。

z <- "3"
z
[1] "3"

一見、数値の3が代入されているようにみえますが、"3"のように"で囲まれているので、文字列として扱われます。

[1] "character"
[1] "character"

yzcharacterと表示され、文字列型であることが分かりました。 文字列に対して,+-などの演算子は使えませんが,文字列操作のための関数を利用して処理を行います。

3.1.4 論理型

論理型はTRUEFALSEの2つの値をとります。 論理型に対しては,論理演算子が使えます。

a <- c(1,2,3,4,5) # 数ベクトル
b <- a < 3 # 条件式
b
[1]  TRUE  TRUE FALSE FALSE FALSE

このbのクラスを調べてみましょう。

[1] "logical"

blogicalであり,論理型であることが分かりました。 論理型は,条件式の評価結果として得られることが多いです。 例えば,条件を満たすデータの個数を調べる場合は,

sum(b) # bは論理型
[1] 2

2と表示され,数ベクトルaのうち,条件式a < 3を満たすデータは2つであることが分かります。

3.1.5 因子型

因子型(factor class)は,カテゴリー型のデータを扱うための型です。 因子型であるかどうかは,分析者が明示的に指定する必要があります。 例えば,アンケート結果のデータには,大学の学年を表す変数があるとします。

grade <- c("1回生", "2回生", "2回生", "3回生", "4回生", "4回生")

このgradeのクラスを調べてみましょう。

class(grade)
[1] "character"

gradecharacterであり,文字列型であることが分かりました。 ここで,このgradeはただの文字列ではなく,カテゴリーを表しているので, たとえば,1回生は1,2回生は2,という風に数値だったとしても,同じカテゴリーを表します。

grade_num <- c(1, 2, 2, 3, 4, 4)
class(grade_num)
[1] "numeric"

このgrade_numnumericであり,数値型ですが,1は1回生,2は2回生,3は3回生,4は4回生を表すカテゴリー変数です。

このようなカテゴリーを表す文字列や数値を,因子型としてRに認識させることで,分析が便利になります。 カテゴリーを表す変数を因子型に変換するには,

  • as.factor()関数 : 単に因子型に変換するだけ
  • factor()関数 : 因子型にしつつ追加の特徴もつけられる
  • forecats:::fct_relevel()関数 : 便利だけれど,ここでは使わない

のいずれかを使います。

as.factor(grade)
[1] 1回生 2回生 2回生 3回生 4回生 4回生
Levels: 1回生 2回生 3回生 4回生
factor(grade)
[1] 1回生 2回生 2回生 3回生 4回生 4回生
Levels: 1回生 2回生 3回生 4回生

いずれも因子型に変換され,Levelsとしてカテゴリーが表示されます。

as.factor(grade_num)
[1] 1 2 2 3 4 4
Levels: 1 2 3 4
factor(grade_num)
[1] 1 2 2 3 4 4
Levels: 1 2 3 4

as.factor()関数とfactor()関数は数ベクトルも因子型に変換できますが,forcats:::fct_relevel()関数は文字列型のみしか変換できません。 ここでは,factor()関数を使うことにします。 factor()関数の引数は,

  • x : 変換する変数
  • levels : 含まれるカテゴリー,すべてのカテゴリーを明記する必要がある。
  • labels : カテゴリーに割り当てるカテゴリー名
  • ordered : 順番を明示するかどうか

の4つです。 次に,数ベクトルgrade_numを因子型に変換しつつ,数値が表すカテゴリー名を指定して,順番があることを明示したものをf_grade_numに代入します。

f_grade_num <- factor(grade_num, # 変換する変数
    levels = c(1, 2, 3, 4), # 含まれるカテゴリー
    labels = c("1回生", "2回生", "3回生", "4回生"), # カテゴリー名
    ordered = TRUE # 順番を明示
    )
f_grade_num
[1] 1回生 2回生 2回生 3回生 4回生 4回生
Levels: 1回生 < 2回生 < 3回生 < 4回生

f_grade_numが因子型となり,LevelsとしてカテゴリーがLevels: 1回生 < 2回生 < 3回生 < 4回生のように順番があることをRが認識していることがわかります。 このf_grade_numのクラスを調べてみましょう。

class(f_grade_num)
[1] "ordered" "factor" 

"ordered""factor"と表示され,順序のある因子型であることが分かりました。

3.1.6 行列型

行列型(matrix class)は,行と列にデータが格納された2次元のデータ構造です。 行列型は,matrix()関数を使って作成します。 matrix()関数の引数は主に,

  • data : 行列に格納するデータ
  • nrow : 行数
  • ncol : 列数

です。 例えば,次の行列を作成してみましょう。

\begin{aligned} \boldsymbol{A} = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{pmatrix} \end{aligned}

A = matrix(c(1, 3, 7, 2, 5, 8, 5, 9, 4), # 行列に格納するデータ
    nrow = 3, # 行数
    ncol = 3 # 列数
    )
A
     [,1] [,2] [,3]
[1,]    1    2    5
[2,]    3    5    9
[3,]    7    8    4

数値を格納した行列型Aが作成されました。 ついでみ,行列に含まれるデータの文字列が含まれていたらどうなるか調べてみましょう。2行1列のデータに"2"を入れてみます。

B = matrix(c(1, 3, 7, "2", 5, 8, 5, 9, 4), # 行列に格納するデータ
    nrow = 3, # 行数
    ncol = 3 # 列数
    )
B
     [,1] [,2] [,3]
[1,] "1"  "2"  "5" 
[2,] "3"  "5"  "9" 
[3,] "7"  "8"  "4" 

すべてのデータが文字列型になってしまいました。 このように行列式は1種類の型しか格納できない,という特徴があります。

数値でできた行列Aのクラスを調べてみましょう。

[1] "matrix" "array" 

A"matrix""array"であり,行列型(そして配列型array)であることが分かりました。 因子分析や主成分分析を厳密に使う,あるいは統計分析の手法を自分で実装しようとしない限り,行列型を使うことはないのですが,Rは逆行列の計算や固有値・固有ベクトルの計算など,行列計算が早く,便利な関数が多く用意されています。

例えば,行列Aの逆行列を計算するには,solve()関数を使います。

inverseA <- solve(A)
inverseA
      [,1] [,2] [,3]
[1,]  10.4 -6.4  1.4
[2,] -10.2  6.2 -1.2
[3,]   2.2 -1.2  0.2

逆行列が計算できているかどうかを確認してみる。

\begin{aligned} \boldsymbol{A} \times \boldsymbol{A}^{-1} = \boldsymbol{I} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} \end{aligned}

行列のかけ算は%*%で行います。

I <- A %*% inverseA
round(I, digits = 2)
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

Rの数値計算では,浮動小数点数演算における丸め誤差のため,round()関数で小数点以下第2位で四捨五入した結果を表示してみました。単位行列\boldsymbol{I}になっていることが分かりました。

3.1.7 データフレーム型

データフレーム型(data.frame class)は,行と列にデータが格納された2次元のデータ構造です。 行列型と似ていますが,データフレーム型は,行ごとに異なる型のデータを格納することができます。

データフレームdata.frame型は非常に重要な型で,Rでデータ分析を行う際には,ほとんどの場合,データフレーム型を扱うことになります。 次のセクションで,データフレーム型について詳しく説明します。