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でデータ分析を行う際には,ほとんどの場合,データフレーム型を扱うことになります。 次のセクションで,データフレーム型について詳しく説明します。