【R言語】行列事始

##はじめに
最近、Rの言語を勉強し直しております。
前回はベクトルについて書かせていただきましたが、今回はベクトルを組み合わせて行と列の二次元配列で表現する行列の基本を紹介させていただければと思います。
※色々と勉強不足なので後々追記するかもしれません。

前回の記事：[【R言語】ベクトル事始](https://qiita.com/taro_6974/items/ae1c4fdca4183526aa34)

##行列の作成

R言語において、行と列を持つ2次元配列のことを行列として扱います。
作成の仕方はmatrix()関数を用います。

| 関数      |説明 | 
|:-----------------|:------------------|
| matrix(a:b,nrow = c, ncol=d)    |matrix(要素ベクトル,行数c,列数d)で行列を作成|

```matrix.r

# パッケージ-------------
install.packages("pipeR")
library(pipeR)

# 行列作成-------------

#2行3列の行を作成する
m <- matrix(1:6,nrow = 2,ncol = 3) %>>%
  print()

```

###行列の操作

行列を操作する関数・コマンドは多々ありますが、汎用的によく使う関数を紹介します。

| 関数・コマンド      |説明 | 
|:-----------------|:------------------|
| 行列名[x,]    |x行目を取り出す|
| 行列名[,x]    |x列目を取り出す|
| 行列名[x,y]    |x行y列目の要素を取り出す|
| 行列名[c(a,b),x]    |a,b行x列目の要素を取り出す|
| 行列名[c(a,b),c(x,y)]    |a,b行目とx,y列を取り出す|
| 行列名[-c(x,y),]    |x,y行を除いた行列を取り出す|
| 行列名[,-c(x,y)]    |x,y列を除いた行列を取り出す|
| 行列名[c(T,F,T,...),]    |Tの行は抽出する、Fの行は抽出しない|
| 行列名[,c(T,F,T,...)]    |Tの列は抽出する、Fの列は抽出しない|
| rbind(c(a,b),c(x,y))    |行結合|
| cbind(c(a,b),c(x,y))     |列結合|
| 行列名[-x,]     |x行目を削除|
| 行列名[,-x]     |x列目を削除|
| t()     |転置する|

```matrix.r

（中略）

# 行列操作-------------

#2行目を取り出す
m[2,]

#3列目を取り出す
m[,3]

#1,2行2列目を取り出す
m[c(1,2),2]

#1,2行目と1,3列目を取り出す
m[c(1,2),c(1,3)]

#2行目を除外した行列を取り出す
m[-c(2),]

#1,2列を除外した行列を取り出す
m[,-c(1,2)]

#1行目を取り出す
m[c(T,F),]

#1,3列を取り出す
m[,c(T,F,T)]

#ベクトルの行結合で3 * 2の行列を作成する
m <- rbind(c(1,2,3),c(4,5,6)) %>>%
  print()

#ベクトルの列結合で2 * 4の行列を作成する
m <- cbind(1:2,3:6) %>>%
  print()

#1行目を削除
m <- cbind(1:2,3:6)
m <- m[-1,] %>>%
  print()

#2列目を削除
m <- cbind(1:2,3:6,7) %>>%
  print()
m <- m[,-2] %>>%
  print()

#3行4列の行列を転置する（例だと4行3列になる）
m <- matrix(1:12, nrow=3, ncol=4) %>>%
  t() %>>%
  print()

```

##行列計算

行列の計算方法です。
高度な計算も行えますが、まだ説明ができないので省略させていただいております。
すみません。

| 関数      |説明 | 
|:-----------------|:------------------|
|rowSums() |行の総和|
|colSums() |列の総和|
|rowMeans() |行平均|
|colMeans() |列平均|

```matrix.r

（中略）

# 行列計算-------------
m <- matrix(1:6,nrow = 2,ncol = 3) %>>%
  print()

#行の総和
m %>>%
  rowSums()

#列の総和
m %>>%
  colSums()

#行の平均
m %>>%
  rowMeans()

#列の平均
m %>>%
  colMeans()

```

##行列のデータ型とデータ構造
R言語の行列では実数、整数、文字列など組み合わせて行列をなしていることがあり、データ型を型変換していると次第にどの型を使用しているのか混乱することがあり、型検査によって検査することができ、型変換で任意のデータ型に変換することもできます。
例を以下に紹介します。

| 関数      |説明 | 
|:-----------------|:------------------|
|is.numeric()  |行列が実数であればTRUE、該当しなければFALSEを返す|
|is.integer()  |行列が整数であればTRUE、該当しなければFALSEを返す|
|is.character()  |行列が文字列であればTRUE、該当しなければFALSEを返す|
|is.logical()  |行列が論理値であればTRUE、該当しなければFALSEを返す|
|is.complex()  |行列が複素数であればTRUE、該当しなければFALSEを返す|
|as.numeric()  |実数に変換|
|as.integer()  |整数に変換|
|as.character()  |文字列に変換|
|as.logical()  |論理値に変換|
|as.complex()  |複素数に変換|

また、ベクトルの要素はすべて同じ型ですが、異なった型のデータを集めてベクトルなり行列を作成するとベクトルの変換規則にしたがって最も優先順位の高い型に変換される点に注意です。

ベクトルの大小関係
**character > complex > numeric > logical > NULL**


```matrix.r

（中略）

# 行列のデータ型-------------

m <- matrix(1:9,nrow=3)
mm <- matrix(21.1:26.1,nrow=3)
mmm <-matrix("txt",nrow = 3)
mmmm <- matrix(TRUE,nrow = 3)
cm <- matrix(complex(re=1:3, im=4:6) ,nrow = 3)

#整数値型かチェック
m %>>% 
 is.integer()

#実数値型かチェック
mm %>>% 
  is.numeric()

#文字列型かチェック
mmm %>>% 
  is.character()

#論理値型かチェック
mmmm %>>% 
  is.logical()

#複素数型かチェック
cm %>>%
  is.complex()

#整数値型に変換
mm %>>%
  as.integer()

#実数値型に変換
m %>>%
  as.numeric()

#文字列型に変換
m %>>%
  as.character()

#論理値型に変換
m %>>%
  as.logical()

#複素数型に変換
m %>>%
  as.complex()


```

他にも配列からリストへ、リストからデータフレーム型へと構造自体を変換することができますが、同様にデータ構造の検査と変換も行うことができます。
今はまだ紹介しきれていないデータ構造もありますので、実際の業務に入るまでは「こんなものがあるんだー」ぐらいの認識で良いかと（実務に入って全く理解していないと結構きつかったりしますが）。特にデータフレームに関しましては後日改めて記事を書こうかと思っています。

| 関数      |説明 | 
|:-----------------|:------------------|
|is.vector()   |ベクトルであればTRUE、該当しなければFALSEを返す|
|is.matrix()   |行列であればTRUE、該当しなければFALSEを返す|
|is.array()   |配列であればTRUE、該当しなければFALSEを返す|
|is.list()   |リストであればTRUE、該当しなければFALSEを返す|
|is.data.frame()   |データフレームであればTRUE、該当しなければFALSEを返す|
|is.factor()   |順序なし因子であればTRUE、該当しなければFALSEを返す|
|is.ordered()   |順序つき因子であればTRUE、該当しなければFALSEを返す|
|as.vector()   |ベクトルに変換する|
|as.matrix()   |行列に変換する|
|as.array()   |配列に変換する|
|as.list()   |リストに変換する|
|as.data.frame()   |データフレームに変換する|
|as.factor()   |順序なし因子に変換する|
|as.ordered   |順序つき因子に変換する|


以上、おわりっ