x <- 2
x
[1] 2
Rの基本的な使い方を学びます。 Rがあつかうデータや分析結果などを格納するため,名前をつけて扱うことができるものを一般にオブジェクト(object)とよびます。 Rでは,オブジェクトの型として,次のようなものがあります。
numeric
: 実数 (浮動小数点数)character
: 文字列logical
: 論理値 TRUE または FALSEfactor
: ファクター型・因子型matrix
: 行列data.frame
: データフレームlist
: リストNULL
: 空のオブジェクトここでは,それぞれの型の特徴を簡単に説明します。
オブジェクトに値を代入するには、<-
を使います。 x
に数値の2
を代入してみます。
x <- 2
x
[1] 2
このx
の型を調べるには、class()
を使います。
class(x)
[1] "numeric"
numeric
と表示され,このオブジェクトx
は数値型であることが分かりました。 数値に対しては,四則演算やべき乗などの演算子が使えます。
文字列を代入する場合は""
で囲みます。
y <- "Hello, World!" # 文字列を代入
y # 変数yの値を表示
[1] "Hello, World!"
では、次の場合はどうなるか考えてみてください。
z <- "3"
z
[1] "3"
一見、数値の3が代入されているようにみえますが、"3"
のように"
で囲まれているので、文字列として扱われます。
y
もz
もcharacter
と表示され、文字列型であることが分かりました。 文字列に対して,+
や-
などの演算子は使えませんが,文字列操作のための関数を利用して処理を行います。
論理型はTRUE
とFALSE
の2つの値をとります。 論理型に対しては,論理演算子が使えます。
a <- c(1,2,3,4,5) # 数ベクトル
b <- a < 3 # 条件式
b
[1] TRUE TRUE FALSE FALSE FALSE
このb
のクラスを調べてみましょう。
class(b)
[1] "logical"
b
はlogical
であり,論理型であることが分かりました。 論理型は,条件式の評価結果として得られることが多いです。 例えば,条件を満たすデータの個数を調べる場合は,
sum(b) # bは論理型
[1] 2
2
と表示され,数ベクトルa
のうち,条件式a < 3
を満たすデータは2つであることが分かります。
因子型(factor class)は,カテゴリー型のデータを扱うための型です。 因子型であるかどうかは,分析者が明示的に指定する必要があります。 例えば,アンケート結果のデータには,大学の学年を表す変数があるとします。
grade <- c("1回生", "2回生", "2回生", "3回生", "4回生", "4回生")
このgrade
のクラスを調べてみましょう。
class(grade)
[1] "character"
grade
はcharacter
であり,文字列型であることが分かりました。 ここで,このgrade
はただの文字列ではなく,カテゴリーを表しているので, たとえば,1回生は1,2回生は2,という風に数値だったとしても,同じカテゴリーを表します。
このgrade_num
はnumeric
であり,数値型ですが,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"
と表示され,順序のある因子型であることが分かりました。
行列型(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}
[,1] [,2] [,3]
[1,] 1 2 5
[2,] 3 5 9
[3,] 7 8 4
数値を格納した行列型A
が作成されました。 ついでみ,行列に含まれるデータの文字列が含まれていたらどうなるか調べてみましょう。2行1列のデータに"2"
を入れてみます。
[,1] [,2] [,3]
[1,] "1" "2" "5"
[2,] "3" "5" "9"
[3,] "7" "8" "4"
すべてのデータが文字列型になってしまいました。 このように行列式は1種類の型しか格納できない,という特徴があります。
数値でできた行列A
のクラスを調べてみましょう。
class(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}
行列のかけ算は%*%
で行います。
Rの数値計算では,浮動小数点数演算における丸め誤差のため,round()
関数で小数点以下第2位で四捨五入した結果を表示してみました。単位行列\boldsymbol{I}になっていることが分かりました。
データフレーム型(data.frame class)は,行と列にデータが格納された2次元のデータ構造です。 行列型と似ていますが,データフレーム型は,行ごとに異なる型のデータを格納することができます。
データフレームdata.frame
型は非常に重要な型で,Rでデータ分析を行う際には,ほとんどの場合,データフレーム型を扱うことになります。 次のセクションで,データフレーム型について詳しく説明します。