バイオインフォマティクスのデータ解析では、複雑なデータセットを効率的に操作するスキルが求められます。その中でも dplyr
は、データ操作を簡潔に記述できる R の強力なパッケージです。特に、rowwise()
と組み合わせて使う c_across()
は、行ごとに複数の列を集計・変換する際に非常に便利な関数です。
本記事では、c_across()
の基本から応用まで をバイオインフォマティクスの視点で解説します。
1. c_across() の基本
c_across() とは?
c_across()
は rowwise()
とセットで使うことが前提の関数で、行ごとに複数の列を選択して処理を行う ために設計されています。通常の mutate()
は列単位で処理を行いますが、c_across()
を使うと行ごとに処理できるのが特徴です。
基本的な使い方
まずは簡単なデータフレームを作成し、c_across()
を使って行ごとの平均を計算する例を見てみましょう。
library(tidyverse)
# サンプルデータ
df <- tibble(
Sample = c("A", "B", "C"),
Gene1 = c(2.3, 5.1, 3.7),
Gene2 = c(1.8, 4.9, 2.9),
Gene3 = c(3.1, 5.5, 4.2)
)
# c_across を用いた行ごとの平均計算
df %>%
rowwise() %>%
mutate(Mean_Expression = mean(c_across(Gene1:Gene3)))
出力:
# A tibble: 3 × 5
Sample Gene1 Gene2 Gene3 Mean_Expression
<chr> <dbl> <dbl> <dbl> <dbl>
1 A 2.3 1.8 3.1 2.4
2 B 5.1 4.9 5.5 5.17
3 C 3.7 2.9 4.2 3.6
ポイント:
rowwise()
を指定することで、mutate()
の計算が行ごとに適用される。c_across(Gene1:Gene3)
で、Gene1~Gene3 のデータを取得し、mean()
を適用している。
2. 応用:バイオインフォマティクスにおける活用
バイオインフォマティクスでは、遺伝子発現データやシークエンシングデータの前処理に c_across()
が役立ちます。ここでは、遺伝子発現データのスケーリングやフィルタリングの例を紹介します。
2.1 Zスコア標準化
遺伝子発現データのスケールを揃えるために、Zスコア(標準化)を行うのは一般的です。各行ごとに平均と標準偏差を計算し、各値を標準化する方法を c_across()
を使って実装します。
df %>%
rowwise() %>%
mutate(
Mean = mean(c_across(Gene1:Gene3)),
SD = sd(c_across(Gene1:Gene3)),
across(Gene1:Gene3, ~ (.x - Mean) / SD, .names = "Z_{.col}")
) %>%
select(Sample, starts_with("Z_")) # 必要な列だけ選択
出力:
# A tibble: 3 × 4
Sample Z_Gene1 Z_Gene2 Z_Gene3
<chr> <dbl> <dbl> <dbl>
1 A -0.267 -1.09 1.36
2 B -0.267 -1.17 1.44
3 C -0.348 -1.16 1.50
2.2 しきい値によるフィルタリング
バイオインフォマティクスでは、ノイズの多いデータを除去するために、発現量の平均が一定のしきい値を超えている遺伝子だけを保持することがあります。
例えば、各サンプルの発現量の平均が 3.0 以上の行だけを残す 方法は以下のように記述できます。
df %>%
rowwise() %>%
mutate(Mean_Expression = mean(c_across(Gene1:Gene3))) %>%
ungroup() %>%
filter(Mean_Expression >= 3.0)
出力:
# A tibble: 2 × 5
Sample Gene1 Gene2 Gene3 Mean_Expression
<chr> <dbl> <dbl> <dbl> <dbl>
1 B 5.1 4.9 5.5 5.17
2 C 3.7 2.9 4.2 3.6
ポイント:
rowwise()
で行ごとに平均を計算し、しきい値でフィルタリングする。ungroup()
を使うことで、filter()
を適用可能にする。
3. c_across() のパフォーマンス最適化
c_across()
を rowwise()
で適用すると直感的にデータを操作できますが、大規模データには across()
を使った列単位の処理 のほうが高速です。
例えば、行ごとの処理が必要ない場合、以下のように across()
で処理できます。
df %>%
mutate(across(Gene1:Gene3, scale)) # 各列を標準化
これは 列ごとに一括処理 するため、高速に動作します。
まとめ
c_across()
は rowwise()
と組み合わせることで、行ごとの集計やフィルタリングを直感的に記述できます。特にバイオインフォマティクスでは、遺伝子発現データの前処理(標準化・フィルタリング・スケーリング)に役立ちます!!
今回学んだポイント
c_across()
の基本 – 行ごとに複数の列を選択して処理- Zスコア標準化 – 遺伝子発現データのスケール調整
- しきい値フィルタリング – 発現量が一定値以上の遺伝子のみ抽出
- パフォーマンス最適化 –
c_across()
は便利だが、大規模データにはacross()
が適している
バイオインフォマティクスのデータ解析を効率化するために、ぜひ c_across()
を活用してみてくださいね〜!