2016/07/22

2020/05/04

Rでのベクトル・行列の作成と四則演算・要素の参照【第1回】

R言語入門

ライター:

初心者向けのR言語講座

このコーナーでは、完全な初心者向けに、R言語でのプログラミングを紹介していきます。

今回は入門コーナーの初回ということで、本当に基礎中の基礎を学んでいきましょう。今回で、Rの使い方がある程度おわかりいただけるかと思います。さて、Rでいう基礎とは、ベクトルと行列の操作です。Rでいうベクトルや行列とはそもそも何なのか、そこも含めて解説していきます。

 

R言語では基本的に解析データをデータフレームとして読み込みます。データフレームとは、データを表のように扱うR言語の型の一種であり、行列などとよく似ていて、いくつものベクトルの集合体でもあります。

つまりベクトルや行列の操作が出来れば、R言語での、統計的解析が出来るということです。

ベクトルを作ってみよう

ベクトルを作るときはc()で生成します。皆さんベクトルというと、高校生の時に習った2次元のベクトルや、3次元のベクトルが思い浮かぶと思います。Rでは”多次元”ベクトルを扱います。5次元や10次元、、、あるいはもっと、、、

とにかく数字の列、いわば数列のようなものをベクトルとして扱います。そしてそれを数列ではなくn次元(多次元)ベクトルとして扱います。Rではベクトルとは言いますが、その扱いはリストのようなものです。

では早速プログラムを見てみます。出来ればRを立ち上げ、一緒に書いてみましょう!!

プログラム
x <- c(1,2,3,4,5)
y <- c(1:5,3:1)
z <- c(rep(3,4),rep(c(1,5,10),c(2,3,4)))
a <- c(“A”,”B”,”C”)

上記を1行づつRに入力していきます。まだ、ピンと来ないかもしれませんが、これで新しくベクトルx,y,z,aが定義されました。

それぞれどんなベクトルになったのか、ちょっと見てみます。変数の中身を参照するときは変数名だけを入力してエンターです。

プログラム
> x
[1] 1 2 3 4 5
> y
[1] 1 2 3 4 5 3 2 1
> z
[1] 3 3 3 3 1 1 5 5 5 10 10 10 10
> a
[1] “A” “B” “C”

このようになっているはずです。ここで一番左の[1]というのは、1行目という意味です。ベクトルは1行しかないので[1]としか表示されていませんが、次の項目で触れる行列の場合これが[2]や[3]と続いていきます。

今回使われたコマンドの意味を見てみましょう。

コマンド用法
c()ベクトルを生成。ベクトルの要素同士はカンマで区切る。
<-代入の意。a<-bでaにbを代入。(=でも代用可)
:連続した整数を生成。(1:6は1,2,3,4,5,6と同義)
reprep(a,b)でaをb個並べるの意味。ベクトルでの指定も可。rep(c(1,5,10),c(2,3,4))の場合1を2個、5を3個10を4個ならべます。

これらのコマンドの法則に従って、4つのベクトルが作られたわけです。ではこの数の列が2行や3行、複数行になった場合はどうなるのでしょうか。そういうものは行列として扱います。

行列を作ってみよう

1列のベクトルが、複数集まったものが行列です。行列はmatrix()で作成します。書き方は、

matrix(要素ベクトル,行数,列数)

です。

では行列mat1~mat3を実際に作ってみましょう。2つのmat1はどちらも同じ行列が作成されます。

プログラム
mat1 <- matrix(c(1:10),nrow=2,ncol=5)
mat1 <- matrix(c(1:10),2,5)
mat2 <- matrix(c(1:10),2,byrow=TRUE)
mat3 <- matrix(c(1,3,2,5,7,3,2,15,2),3,3,byrow=TRUE)

mat2はbyrow=TRUEで要素順を変更しています。(本来縦に順番に並べるものを横に順番に並べる)。

またmat2において、行数に2を指定、列数を指定していないのは、要素数が1~10の10個と決まっているので指定しなくても5列になることが明らかだからです。このような場合、Rでは自動的に行ってくれます。ちなみに要素数が11のベクトルは2行になりえないので、そのような記述をした場合には下記のように、エラーが発生します。

プログラム

> mat2 <- matrix(c(1:11),2,byrow=T)
警告メッセージ:
matrix(c(1:11), 2, byrow = T) で:
データ長 [11] が行数 [2] を整数で割った、もしくは掛けた値ではありません

ここで使われている、TとはTRUE(真)の意味です。TRUEと書いても構いません。もし、Tという変数がどこかで定義されている場合、TUREのTよりも変数の方が優先されてしまうので、TではなくTRUEで書くようにしましょう。

さて、行列の中身はどうなっているでしょうか?

プログラム
> mat1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> mat2
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
> mat3
[,1] [,2] [,3]
[1,] 1 3 2
[2,] 5 7 3
[3,] 2 15 2

このようにできていれば、ちゃんと指定の行列が作成されたことになります。ではプログラムで使った記号を一覧で見てみましょう。

コマンド使い方
matrixmatrix(要素ベクトル,行数,列数)で行列を作成。
nrow行数を返す。nrow(a)で行列aの行数を返す。
ncol列数を返す。ncol(a)でaの列数を返す。
byrowbyrow=TUREで要素順を変更。

行列の計算をしてみよう(四則演算)

Rでは計算可能ならば行列同士の計算も出来てしまいます。(行列の要素数の不一致などの問題で計算ができない場合、エラーになります。)

ここでは、先ほど作ったmat1,mat2,mat3を使って、足し算、引き算、掛け算、割り算、行列同士の掛け算をしてみます。

プログラム
> mat1+mat2
[,1] [,2] [,3] [,4] [,5]
[1,] 2 5 8 11 14
[2,] 8 11 14 17 20
> mat1-mat2
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 2 3 4
[2,] -4 -3 -2 -1 0
> mat1*mat2
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 15 28 45
[2,] 12 28 48 72 100
> mat1/mat2
[,1] [,2] [,3] [,4] [,5]
[1,] 1.0000000 1.5000000 1.666667 1.7500000 1.8
[2,] 0.3333333 0.5714286 0.750000 0.8888889 1.0
> mat3%*%mat3
[,1] [,2] [,3]
[1,] 20 54 15
[2,] 46 109 37
[3,] 81 141 53
> solve(mat3)
[,1] [,2] [,3]
[1,] -0.39240506 0.30379747 -0.06329114
[2,] -0.05063291 -0.02531646 0.08860759
[3,] 0.77215190 -0.11392405 -0.10126582

今回は基本的な演算子のみを用いました。意味は以下のとおり。

コマンド使い方
+行列やベクトルの対応する各要素同士を足し合わせる。
-行列やベクトルの対応する各要素同士の引き算を行う
*行列やベクトル同士の同じ部分に位置する要素同士の掛け算を行う。
/行列やベクトルの同じ部分に位置する要素同士の割り算を行う。
%*%行列どうしの掛け算を行う。
solve()逆行列を求める。solve(a)でaという行列の逆行列を返す。

行列内の要素を参照してみよう

行列の作り方と計算方法は分かりましたね。行列の基本操作の最後は、行列へのアクセスです。つまり行列の任意の要素(成分)を参照したり、取り出したりすることです。また、Rでは行列の要素を行ごと列ごとに取り出せたり、自由自在に行列を扱えます。

プログラム
p <- mat1[1,2]
q <- mat3[,2]
r <- mat1[1,c(2,5)]

このように先ほど作った行列をいじった結果をp,q,rに代入してみました。p,q,rの中身はどうなっているでしょうか。

プログラム
> p
[1] 3
> q
[1] 3 7 15
> r
[1] 3 9

このようになっているはずです。一つずつ見ていきましょう。

プログラム意味
mat1[1,2]mat1行列の(1,2)成分を取り出す。
mat3[,2]mat2行列の2列目を取り出す。
mat1[1,c(2,5)]mat1行列の1行目かつ、2列目と5列目を取り出した。

というような具合になっています。つまり行列の要素にアクセスしたい場合、

変数名[アクセスしたい行番号,アクセスしたい列番号]

というようにすればいいのです。複数の要素に同時にアクセスしたい場合は、

プログラム
mat1[1,c(2,5)]

のように列番号をベクトルを使って書くようにします。

mat1[1,c(2,5)]

はmat1行列の1行目かつ、2列目と5列目を取り出します。また、行全てや列全てにアクセスしたい場合は、

プログラム
mat3[,2]

のように片方を空白にしておけば、もう片方の条件を満たす全要素にアクセスします。この場合は2列目という条件しか与えられていないので、行数問わず2列目を全て抽出したことになります。

まとめと復習用コピペプログラム

ベクトルや行列における基本的操作はこれで以上です。Rでは、もっと複雑な操作もできますが、とりあえず絶対に押さえておくべき、代表的なものを紹介しました。

Rでは解析用のデータをExcelファイルなどからデータフレームとして読み込んで、それを解析しやすいように操作してから解析を行います。このデータフレームというのは行列とよく似た構造を持っています。なので、今回学んだことは基本的ではありますが非常に大切です。

今回使ったプログラムを一覧にして載せておきますので復習用として使ってください。コピペで使えます。

プログラム
#ベクトルの作成
x <- c(1,2,3,4,5)
x
y <- c(1:5,3:1)
y
z <- c(rep(3,4),rep(c(1,5,10),c(2,3,4)))
z
a <- c(“A”,”B”,”C”)
a
#ベクトルを作るときはc()で指定。#行列
mat1 <- matrix(c(1:10),nrow=2,ncol=5)
mat1 <- matrix(c(1:10),2,5)
mat2 <- matrix(c(1:10),2,byrow=T)
mat3 <- matrix(c(1,3,2,5,7,3,2,15,2),3,3,byrow=T)
#行列はmatrix()で作成。byrow=Tで要素順が変わる。#行列の計算
mat1+mat2
mat1-mat2
mat1*mat2
mat1/mat2
mat3%*%mat3
solve(mat3)#行列の各要素へのアクセス(参照)
p <- mat1[1,2]
q <- mat3[,2]
r <- mat1[1,c(2,5)]

※#はコメントアウト。プログラムとしてRに読み込まれることはない。#を行頭において、プログラムの説明などのコメント文を書く事が多い。

 

初心者向けのR言語講座
(totalcount 101,018 回, dailycount 157回 , overallcount 16,392,451 回)

ライター:

R言語入門

single-banner

COMMENT

コメントを残す

メールアドレスが公開されることはありません。
*は必須項目です。




CAPTCHA