【R言語チュートリアル①】ベクトル、行列の四則演算

# R言語とは

<img width="400" src="https://www.codexa.net/wp-content/uploads/2018/07/r_main-1200x630.png">

R言語は、統計解析やデータ可視化などのデータ解析に特化したプログラミング言語およびソフトウェア環境です。以下はR言語の主な特徴と用途です。

<dl>
    <dt>1.統計解析</dt>
    <dd>Rは統計解析のために広く使用されており、統計的な計算やデータモデリングを行うための組み込み関数やパッケージが提供されています。線形モデル、非線形モデル、時系列解析、クラスタリング、因子分析など、さまざまな統計手法がサポートされています。</dd>
    <dt>2.データ可視化</dt>
    <dd> Rはデータの可視化に強力でデータの傾向やパターンを効果的に視覚化することができます。</dd>
</dl>

ダウンロード先はこちら：[https://www.r-project.org/](https://www.r-project.org/)

# 四則演算

### ベクトルの作成
基本的にベクトルを宣言する際には、`c()`を使用します。
```R:R
a<-c(1, 5)
x<-c(1:5)
y<-c(rep(3, 4))
z<-c(rep(1, 4), rep(c(6, 3), c(5, 4)))
```

**実行結果**
```R:R
> a
[1] 1 5
> x
[1] 1 2 3 4 5
> y
[1] 3 3 3 3
> z
[1] 1 1 1 1 6 6 6 6 6 3 3 3 3
```
以下は主なコマンドと使用法です。
| コマンド|使用法 |
|:-:|:-:|
|  c(x, y) | x, yが数値としてベクトル化を作成する  |
|  c(x:y) | xからyの数値がベクトルを作成する  |
|  c(rep(x, y)) |  xがy個並んだベクトルを作成する |
|  c(rep(c(a, b), c(c, d))) |  aがc個、bがd個並んだベクトルを作成する |

::: note warn
警告
c(1:5)=1 2 3 4 5のように最後の数値も範囲に含まれることに注意。
:::

### 行列
行列を宣言する際には、`matrix()`を使用します。


```R:R
mat_1<-matrix(c(rep(0, 10)), 5, 2)
mat_2<-matrix(c(rep(0, 10)), 2, 5)
mat_3<-matrix(c(1:10), 2, 5)
mat_4<-matrix(c(1:10), 2, 5, byrow=TRUE)
```
**結果**
```R:R
> mat_1
     [,1] [,2]
[1,]    0    0
[2,]    0    0
[3,]    0    0
[4,]    0    0
[5,]    0    0

> mat_2
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0

> mat_3
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10

> mat_4
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
```

以下は主なコマンドと使用法です。
| コマンド|使用法 |
|:-:|:-:|
|  matrix(c(x, y), nrow, ncol, byrow) | 指定した行数と列数で行列を作成する  |
|  nrow | 行数を指定する  |
|  ncol |  列数を指定する |
|  byrow |  要素を配置する順番を指定する。（TRUE: 行方向） |

:::note info
インフォメーション
Rでは行列の配置は列方向がデフォルトになっている。変更する場合にbyrow=TRUEを用いる。
:::

### 四則演算

```R:R
mat_x<-matrix(c(1:10), 2, 5)
mat_y<-matrix(c(10:1), 2, 5)

mat_x + mat_y
mat_x - mat_y
mat_x * mat_y
mat_x / mat_y
```
**結果**
```R:R
> mat_x + mat_y
     [,1] [,2] [,3] [,4] [,5]
[1,]   11   11   11   11   11
[2,]   11   11   11   11   11

> mat_x - mat_y
     [,1] [,2] [,3] [,4] [,5]
[1,]   -9   -5   -1    3    7
[2,]   -7   -3    1    5    9

> mat_x * mat_y
     [,1] [,2] [,3] [,4] [,5]
[1,]   10   24   30   28   18
[2,]   18   28   30   24   10

> mat_x / mat_y
          [,1]      [,2]      [,3]     [,4] [,5]
[1,] 0.1000000 0.3750000 0.8333333 1.750000  4.5
[2,] 0.2222222 0.5714286 1.2000000 2.666667 10.0
```
四則演算の場合は、互いの行数と列数がそれぞれ等しいことが条件となる。

# 行列同士の掛け算

行列同士の掛け算では`%*%`を用いる。
```R:R
mat_x<-matrix(c(1:10), 2, 5)
mat_y<-matrix(c(10:1), 5, 2)

mat_x
mat_y
mat_x%*%mat_y
```
**結果**
```R:R
> mat_x
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
> mat_y
     [,1] [,2]
[1,]   10    5
[2,]    9    4
[3,]    8    3
[4,]    7    2
[5,]    6    1
> mat_x%*%mat_y
     [,1] [,2]
[1,]  180   55
[2,]  220   70
```
行列同士の掛け算では、n×k行列とk×m行列の掛け算がn×m行列となるように、計算する際には配列の形式を考慮する必要がある。

# 逆行列
逆行列とは以下の関係を満たすような行列（ここでは行列$A^{-1}$）を指す。
```math
AA^{-1} = A^{-1}A=I
```
逆行列を求める際には、`sovle()`を使用する。
```R:R
mat<-matrix(c(2, 0, 0, 3), 2, 2)
inv_mat<-solve(mat)
mat%*%inv_mat
inv_mat%*%mat
```
**結果**
```R:R
> mat
     [,1] [,2]
[1,]    2    0
[2,]    0    3

> inv_mat
     [,1]      [,2]
[1,]  0.5 0.0000000
[2,]  0.0 0.3333333

> mat%*%inv_mat
     [,1] [,2]
[1,]    1    0
[2,]    0    1

> inv_mat%*%mat
     [,1] [,2]
[1,]    1    0

```
このように行列に対して、左右どちらから逆行列を書けても単位行列となることが分かる。

:::note alert
行列Aが正方行列でない場合やdet(A)=0の場合は逆行列が存在しないため注意が必要。
:::

# まとめ
学部2年以降、授業以外でR言語に触れることがなかったため、改めて最初から学び直そうと思い記事を書いてみました。基本的には、備忘録的な用途で投稿していきたいと思います。


**次**：[【R言語チュートリアル②】データフレームの利用](https://qiita.com/Yuhei0531/items/ef47e5f7e36f65b158d7)