こんにちは。usagi-sanです。
この記事では、統計解析やデータ解析で重宝されるR言語をプログラミング初心者に向けて説明していきます。
初心者にもわかりやすいよう、プログラミングの専門用語はなるべく避けて解説していきます。
ここでは、R言語で解析を行う上で前提となる知識のみ紹介します。
以降の記事を読む前にぜひ入門編として読んでください。
今回用いるプログラミングコードは以下のダウンロードリンクからも入手可能です。
R言語入門 プログラミングコード Rスクリプト
R言語入門
四則演算
まず初めに四則演算について紹介します。以下の演算記号で和差積商と整数商、剰余、累乗を行うことが可能です。
1 2 3 4 5 6 7 8 9 10 | #四則演算 1+2 #和 3-1 #差 2*2 #積 4/2 #商 #整数商,剰余,累乗 20%/%3 #整数商 20%%3 #剰余 2^2 #累乗 |
四則演算に関しては、他のプログラミング言語と同じ記号を用います。
整数商と剰余についてですが、整数商は小学校までに習った割り算と考えてください。%/%で表します。
剰余はその割り算の余りです。%%で表します。
累乗は\(2^2=2\times2=4\)を意味し、^で表します。
代入
次に代入について説明します。R言語でも他のプログラミング言語と同じように、値を代入することができます。
1 2 3 4 5 6 7 8 9 10 11 | #代入 x <- 4 #xに4を代入 y <- x #yにxを代入 z <- x*y #xにx*yを代入 z x <- 1 a <- 1+2 b <- 2*2 c <- b-a c |
R言語で代入するとき、<-または=を用います。
1行目はxに4を代入しています。
2行目はyにxを代入しています。
3行目はzにx*yを代入しています。
yはxであるためzの値は4*4=16となります。
論理演算
次に論理演算について説明します。
論理演算とはAかつB、AまたはBのような条件式を考える際に必要となります。
次のようにして論理和、論理積、否定を表現することができます。
1 2 3 4 5 6 7 8 | #論理演算 x <- T y <- F x | y #論理和 x & y #論理積 !(x | y) #否定 !(x & y ) |
論理演算の真偽値はTとFで表します。(TRUEとFALSEでも構いません。)
論理和は|で表し、論理積は&で表します。
xがTRUE、yがFALSEであるため、xとyの論理和はTRUEでありxとyの論理積はFALSEとなります。
否定は!を用います。真偽値の前に!を置くことで真偽値を反転させることができます。したがって!(x | y)はFALSEとなります。
ベクトルと行列
ベクトルと行列の定義の仕方について説明します。
R言語ではエクセルデータなどのデータは、主に列単位で扱います。
例えば、エクセルデータの身長という列を参照する場合、1行1列目,1行2列目,...と参照するのではなく、身長という列を参照するのがより自然です。
データにアクセスしやすいという利点から次に示すベクトルと行列の操作は非常に重要です。(基本的にベクトルや行列のままデータを扱います。)
1 2 3 4 5 6 | #ベクトル,行列 x <- c(1,2,3,4) y <- 1:4 X <- matrix(1:4, nrow = 2, ncol = 2) Y <- matrix(1:4, nrow = 2, ncol = 2, byrow = T) #byrow:要素を並べる順番を縦から横 |
ベクトルはc(n,...,n)のようにして定義します(1行目)。
2行目について、a:bとするとaからbまでの1つずつ増えていくベクトルを作ることができます。
行列はmatrixを用いることで定義できます。matrix(ベクトル, nrow = 行数, ncol = 列数, byrow = 真偽値)と与えることで詳細な設定が可能です。
4行目ではベクトル(1,2,3,4)を縦に並べ2×2の行列を作っています。
5行目はbyrowをTRUEにすることで、ベクトル(1,2,3,4)を横に並べ2×2の行列を作っています。
ベクトルと行列の演算
次にベクトルと行列についての演算について説明します。
ベクトルと行列に対しても、最初に説明した演算を行うことが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #ベクトル,行列の演算 x <- 1:4 y <- c(3,6,1,2) x + y #和 x - y #差 x * y #要素同士の積 x / y #要素同士の商 x %/% y #要素同士の整数商 x %% y #要素同士の剰余 x %*% y #内積 X <- matrix(x, nrow = 2, ncol = 2) Y <- matrix(y, nrow = 2, ncol = 2) X + Y #和 X - Y #積 X * Y #要素同士の積 X / Y #要素同士の商 X %/% Y #要素同士の整数商 X %% Y #要素同士の剰余 X %*% Y #行列の積(内積) |
1行目でxにベクトル(1,2,3,4)を代入し、2行目でyにベクトル(3,6,1,2)を代入しています。
ベクトルに対しても四則演算等を行うことができます。
4~10行目ではベクトルの要素同士の四則演算、整数商、剰余を行っています。
例に、4行目では(1,2,3,4)+(3,6,1,2)=(4,8,4,6)を計算しています。
同様に差積商、整数商、剰余についても要素同士の演算を行います。
さらに11行目でベクトルの内積を計算しています。内積は%*%で表します。
内積とは(1,2,3,4)・(3,6,1,2)=1×3 + 2×6 + 3×1 + 4×2=26といった計算をいいます。
内積は普通のデータ解析や統計解析ではあまり用いないため、わからなくても大丈夫です。
行列の演算もベクトルの時と同様に行います。
13行目でベクトルxを並べて2×2の行列を作っています。
14行目でベクトルyを並べて2×2の行列を作っています。
四則演算、整数商、剰余、行列の積(内積)もベクトルと同じようにして行うことができます。
if文とfor文
if文とfor文は次のようにif(条件式){}、for(条件式){}とすることで定義することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #####if文 x <- 0 y <- 1 if(x & y){ print("hoge") } else if(x == 0){ print("hogehoge") } else{ print("bar") } #####よくある間違い if(x & y){ print("hoge") } else{ #####if文の}後に改行を入れるとエラーが発生します print("bar") } ####{}でくくったり関数内に定義するとエラーは出ません { if(x & y){ print("hoge") } else{ #####if文の}後に改行を入れるとエラーが発生します print("bar") } } |
1行目でxに0を代入し、2行目でyに1を代入しています。
4~11行目でif文を用いた条件分岐を行っています。
xとyの論理積はFALSEであり、x=0であるため7行目のprint("hogehoge")が実行されます。
"hogehoge"という文字がコンソール上に出力されます。
注意したいのが13~19行目で、他のプログラミング言語と同じような書き方(改行)をしていますが、
R言語ではif(){}の後に改行を入れてしまうと、その時点でif文が終了したと判定され、その後のelse文にはif文がないとエラーを出します。
21行目以降のようにif文を{}でくくったり、function内に記述することでエラーを回避できます。
次にfor文は以下のよう、for(条件式){}で表現されます。
1 2 3 4 5 6 7 8 | ######for文 for(i in 1:10){ print("hoge") } for(i in c("hoge","hogehoge","bar")){ print(i) } |
2~4行目では、iがベクトル(1,2,...,9,10)の最初の要素から最後までとっています。
すなわちiが1から10まで1ずつ増えながら、"hoge"という文字を出力します。
6~8行目では、iがベクトル("hoge","hogehoge","bar")の最初の要素"hoge"から最後の要素"bar"までとっています。
すなわち7行目のprint(i)では("hoge","hogehoge","bar")の各要素が出力されます。
関数
1 2 3 4 5 6 7 8 9 10 | #関数 sample_mean <- function(x){ #ベクトルxの平均値を求める関数 sum_x <- 0 for(i in 1:length(x)){ #ベクトルxの要素の和 sum_x <- sum_x + x[i] } return(sum_x/length(x)) } sample_mean(c(1,2,3)) #1,2,3の平均値 |
関数はfunction(引数){}で定義することができます。
例として、上ではベクトルの要素の平均値を求める関数を定義しました。
この場合、平均値を求めたいベクトルは引数にあたります。
3行名で仮の数値を定義します。
4~6行目で、引数のベクトルの1~length(x)の要素の和をとりsum_xに代入しています。
length(x)はベクトルxの長さを返す関数であり、今後よく使います。
和をとったら7行目の return()で括弧内の平均値を返します。
以下に、よく用いるベクトルの関数を紹介します。
sum(x) | ベクトルxの各要素の和を返す |
mean(x) | ベクトルxの各要素の平均を返す |
median(x) | ベクトルx各要素の中央値を返す |
length(x) | ベクトルxの要素数を返す |
R言語にもリストを定義することができます。
R言語ではリストはエクセルデータを行単位で扱う場合に用います。
次のコードを例を見ていきましょう。
1 2 3 4 5 6 7 | #リスト x <- list(100,"hoge",1.0) #異なるタイプの要素を複数格納できる x[[1]] x[[2]] y <- list(年齢=100, 名前="Bill", 性別="M") #ハッシュデータを構成できる。年齢と100が紐づけられる。 y$年齢 |
2行目に100,"hoge",1.0という3つの型の違うデータをリストに格納しました。
1列目を身長、2列目を名前、3列目を視力とすると2行目のリストがある個人のデータとしてみることが可能です。
リストの各要素のアクセスは、3,4行目のようにx[[n]]で行います。
また6行目のようにハッシュデータを作り、列名を定義することができる。
6行目では、実際に年齢、名前、性別を定義し、各々に100、"Bill"、Mをもつリストを作成している。
7行目のようにy$年齢とすると、年齢に対応する100を出力することができる。
データフレーム
R言語では解析するデータをデータフレームという一つの単位で扱います。
以下のようにして、データフレームを構成することができます。
1 2 3 4 5 6 7 8 9 | #データフレーム height <- c(170, 160, 180, 150, 100, 200) weight <- c(60, 55, 80, 50, 20, 130) data <- data.frame(height, weight) data$height data[1,2] data$sex <- c("Male","Male","Male","Female","Female","Male") data$BMI <- data$weight / ((data$height/100)^2) |
2,3行目でheight,weightのベクトルを作り
4行目でdata.frame(ベクトル,...,ベクトル)とすることでdataというデータフレームにheightとweightのベクトルを格納しました。
ベクトルを複数定義するよりデータフレームという1つの単位で扱えるようになります。
データフレームのa行目、b列目の要素の参照はdata[a,b]によって行われます。
またdata[a,]でa行目のベクトル、data[,b]でb列目のベクトルを参照することもできます。
また、8,9行目のようにして、データフレームdataにsex,BMIという列を定義することが可能です。