ケモインフォマティクスで学ぶRの変数とデータ型

# はじめに

製薬企業の仕事では、化合物の構造を扱うことがよくあります。 自社で合成した新薬候補の化合物やその代謝物、および生体内にもともと存在する内因性の代謝産物（アミノ酸、糖、脂質など）の濃度測定や構造解析をするスキルは重要です。

そこでここでは、生体内に存在する脂質の網羅的解析であるLipidomics（リピドミクス）を題材としてRのプログラミングについて解説していきます。 脂質は、様々な構造を持つ分子種が生体内に存在しており、*in silico*で構造を生成できる分子種は100万種を越えます。 こうした分子種の構造を一つ一つ記述したり、分子量や極性などの物性値を算出したりするのは手作業では現実的に難しく、プログラミングが必須になります。

脂質の構造や物性値をプログラミングで扱えるようになれば、新薬候補化合物を対象とするケモインフォマティクスにも応用が利きますので、是非習得してもらえればと思います。

今回は、「変数とデータ型」について解説していきます。
ケモインフォマティクスの実践例を中心に説明していきますので、基本を確認したいという人は以下の記事を読んでからこの記事を読んでみてください。

[製薬企業研究者がRの基本的な記述ルールについてまとめてみた](https://qiita.com/yukiya285/items/afaf2badd96307f2615e)
[製薬企業研究者がRにおける変数についてまとめてみた](https://qiita.com/yukiya285/items/9df88b64e4fae026a56d)
[製薬企業研究者がRで使われる演算子についてまとめてみた](https://qiita.com/yukiya285/items/c57e95a44e7d8981511d)


# 文字列と数値

## 変数の作成と出力

`変数 <- 値`とすることで、新しい変数を作成することができます。
また、`print()`を使うことで、かっこ内のオブジェクト（変数の値やプログラムの実行結果など）を出力することができます。
`#`以降の文字列はコメントとして認識され、プログラムの実行範囲からは除外されます。スクリプトの中にメモを書いたり、エラーが出る部分を実行されないようにしたりするときに使えます。

```r
lipid.class <- "FA" # 文字列
Cn <- 16 # 数値
Un <- 16 # 数値

print(lipid.class) # 変数「lipid.class」の値を出力
print(Cn) # 変数「Cn」の値を出力
print(Un) # 変数「Un」の値を出力
```

変数名は基本的に英単語を使い、数字から始まる変数名をつけることはできません（2文字目以降であれば数字を使うことも可能です）。 変数にどんな値が格納されているのか一目で分かる変数名にすると良いです。 複数単語になる場合は、`.`（ピリオド）で区切り、各単語は基本的には全て小文字で書きます。

文字列は、`"`（クォーテーション）で囲む必要があります。 逆に言うと、クォーテーションで囲まれた数字も文字列として扱われます。
`typeof`を使うことで、かっこ内のオブジェクトのデータ型を確認することができます。

```r
Cn.int <- 16 # 数値のとしての「16」
print(typeof(Cn.int)) # "double"

Cn.chr <- "16" # 文字列としての「16」
print(typeof(Cn.chr)) # "character"
```

ここで、`lipid.class`という変数に格納した`FA`というのは、「fatty acid」すなわち「脂肪酸」の略です。 `lipid.class`というのは、日本語でいうと「脂質クラス」で、脂質のカテゴリーを示します。

また、`Cn`は「number of carbon atoms」すなわち炭素原子の数（炭素鎖の長さ）を、 `Un`は「number (degree) of unsaturation」すなわち不飽和度（二重結合の数）を示しています。

脂質クラスの中でも、脂肪酸は一番単純な構造で、`Cn`と`Un`を指定すれば、構造がほぼ決まります。

他の脂質クラスの多くは、グリセロールなどの骨格に脂肪酸が結合した化学構造となっていて、骨格部分が脂質クラスを特徴づけるものとなっています。

脂質クラスと炭素原子数、不飽和度を組み合わせることで、脂質の分子種がほぼ決まります。

## 文字列の結合

ここで、`lipid.class`と`Cn`と`Un`を文字列として結合することを考えます。

ちなみに、脂肪酸で炭素原子数が16、二重結合数が0の分子種はパルミチン酸（palmitic acid）になります。 パルミチン酸の化学構造などは、以下のリンク先のページに掲載されていますので、適宜参照してください。

[Palmitic acid (FA 16:0) | LIPID MAPS Structure Database](https://www.lipidmaps.org/data/LMSDRecord.php?LMID=LMFA01010001)

```r
lipid.class <- "FA"
Cn <- 16
Un <- 0

molecular.species <- paste0(lipid.class, " ", Cn, ":", Un)
print(molecular.species)
```

`paste0`を用いることで、文字列を結合させることができます。

ここで、`" "`は半角スペースです。

また、リピドミクスの分野では、`Cn`と`Un`を`:`でつなぐのが慣習となっています。

## 応用：SMILES記法

化合物の構造を記述する方法として、「SMILES (simplified molecular input line entry system) 記法」というものがあります。

以下のように、文字列だけで化学構造を記述することができます。

```r
Cn <- 16
carbons <- paste0(rep("C", Cn-1), collapse = "")

smiles.pa <- paste0("OC(", carbons, ")=O", collapse = "")
print(smiles.pa)
```

上のように、SMILES記法では、水素原子（H）を使わずに、化学構造を記述します。
SMILES記法なら、`Cn`の値が変わっても、自動的に分子構造を記述することができます。

# 真偽値

真偽値（ブール型）は、`TRUE`または`FALSE`のどちらかになるデータ型を指します。
複数の変数が同じかどうかを比較したり、ある条件が成り立つかどうかを調べたりするときに使えます。

```r
molecular.species <- "FA 16:0"

palmitic.acid <- "FA 16:0" # パルミチン酸（炭素数16の飽和脂肪酸）
stearic.acid <- "FA 18:0" # ステアリン酸（炭素数18の飽和脂肪酸）

print(molecular.species == palmitic.acid) # TRUE
print(molecular.species == stearic.acid) # FALSE
```


# まとめ

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

- `変数名 <- 値`とすることで、変数を作成できます。
- 文字列は`paste0`で結合することができます。
- `rep(文字列, 回数, collapse="")`で指定回数だけ同じ文字列を繰り返すことができます。SMILES記法で炭素数を指定するときなどに使えます。

続いて、Rのデータ構造について以下の記事で解説しています。

[ケモインフォマティクスで学ぶRのデータ構造](https://qiita.com/yukiya285/items/32a8c05f908b68beb14f)

# 参考資料・リンク

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