ケモインフォマティクスで学ぶRのデータ構造

# はじめに

[ケモインフォマティクスで学ぶRの変数とデータ型](https://qiita.com/yukiya285/items/4e69857e967a6fc06bcb)に引き続き、リピドミクス（脂質の網羅解析）を題材として、「Rのデータ構造」について解説していきます。
ケモインフォマティクスの実践例を中心に説明していきますので、基本を確認したいという人は以下の記事を読んでからこの記事を読んでみてください。

[製薬企業研究者がRのデータ構造についてまとめてみた](https://qiita.com/yukiya285/items/7585f9ee8975cb092cfa)


# ベクトル（vector）

ベクトル（vector）は、同じデータ型の要素をまとめたもので、`ベクトル名 <- c(要素1, 要素2, ・・・)`で作ることができます。以下の例は文字列のみを格納したベクトルですが、数値や真偽値を入れることもできますし、同じ値の要素を複数入れたりすることもできます。
ベクトルの中の要素は、`ベクトル名[インデックス番号]`で値を参照することができます。多くのプログラミング言語ではインデックス番号は`0`から始まりますが、Rでは`1`から始まることに注意する必要があります。

```r
fatty.acids <- c("FA 16:0", "FA 18:0", "FA 18:1", "FA 18:2", "FA 18:3")

print(fatty.acids[1]) # 1番目の要素にアクセス
print(fatty.acids[-1]) # 最後の要素にアクセス
print(fatty.acids[2:4]) # 2番目から4番目の要素にアクセス
```

`ベクトル名[インデックス番号] <- 値`とすることで、指定したインデックス番号の要素の値を更新することができます。指定したインデックス番号の要素が存在しない場合は、新たに要素を追加します。

```r
fatty.acids <- c("FA 16:0", "FA 18:0", "FA 18:1", "FA 18:2", "FA 18:3")

fatty.acids[4] = "FA 18:2 (6Z, 9Z)" # インデックス番号4の要素の値を更新
fatty.acids[6] = "FA 18:4" # インデックス番号6の要素を追加
print(fatty.acids)
```

ちなみに、`(6Z, 9Z)`は、二重結合の位置と様式を表しています。`6`と`9`はカルボン酸とは反対側の炭素原子から数えて何番目の炭素原子が二重結合を形成しているかを示し、`Z`というのは二重結合が*cis*であることを示しています。`E`だと*trans*ということになります。

リノール酸の構造など詳しくは、以下のリンク先を見てください。

[Linoleic acid (FA 18:2)](http://www.lipidmaps.org/data/LMSDRecord.php?LMID=LMFA01030120)

二重結合がある場合は、本来であれば上記のように二重結合の位置や結合様式を明示する必要があるわけですが、少し長くなってしまうので、以降では省略することとします。

リストに含まれる要素の数は`length`で確認することができます。

```r
fatty.acids <- c("FA 16:0", "FA 18:0", "FA 18:1", "FA 18:2", "FA 18:3")

print(length(fatty.acids))
```

連続した整数を要素にもつベクトルを作成する場合は`seq`を使います。
また、同じ整数を要素にもつベクトルを作成する場合は`rep`を使います。

```r
Cns <- seq(16, 24, 2)
print(Cns)

Uns <- rep(0, length(Cns))
print(Uns)

saturated.fatty.acids <- paste0("FA ", Cns, ":", Uns)
print(saturated.fatty.acids)
```

上の例では、飽和脂肪酸の略号を生成しています。
`seq(16, 24)`とすると、16から24までの連続した整数になります。
脂肪酸の炭素原子数は基本的に偶数なので、偶数のみにするために最後に`, 2`をつけています。

# データフレーム（dataframe）

データフレーム（dataframe）は、表形式のデータを扱いたいときに使えます。

```r
name <- c("palmitic acid", "stearic acid", "oleic acid") # 化合物名
Cn <- c(16, 18, 18) # 脂肪酸の炭素原子数（鎖長）
Un <- c(0, 0, 1) # 脂肪酸の二重結合数（不飽和度）

fatty.acids <- data.frame(Name=name, Length=Cn, Unsaturation=Un) # 作成したベクトルを列として結合してdataframeを作成
print(fatty.acids)

print(fatty.acids[1, 1]) # 行番号、列番号を指定
print(fatty.acids$Name) # 列名を指定
print(fatty.acids$Name[1]) # 列名を指定して行番号を指定

linoleic.acid <- data.frame(Name="linoleic acid", Length=18, Unsaturation=2)
fatty.acids <- rbind(fatty.acids, linoleic.acid) # 新しい行を追加
print(fatty.acids)

fatty.acids$Abbreviation <- paste0("FA ", fatty.acids$Length, ":", fatty.acids$Unsaturation) # 列名を指定して新しい列を追加
print(fatty.acids)

exact.mass <- 12 * fatty.acids$Length + 1.00783 * (2 * fatty.acids$Length - 2 * fatty.acids$Unsaturation) + 15.99491 * 2
fatty.acids <- cbind(fatty.acids, exact.mass) # 新しい列を追加
print(fatty.acids)

fatty.acids$Length <- NULL # 列名を指定して削除
fatty.acids$Unsaturation <- NULL # 列名を指定して削除
print(fatty.acids)
```

ここでは、脂肪酸の略号や精密質量をまとめた表を作成しました。

# まとめ

ここでは、Rのデータ構造について、ケモインフォマティクスで使える実践的な知識を中心に解説しました。
もう一度要点をおさらいしておきましょう。

- ベクトルは複数の要素を格納し、データフレームの行や列にすることもできる。
- データフレームは表形式のデータを扱うときに使える。

# 参考資料・リンク

[プログラミング言語Rとは？統計分析に強い？](https://pharma-engineer.com/basic-programming/r-summary/)