バイオインフォマティクスの解析には、tidyverse の dplyr
パッケージが非常に便利です。特に、遺伝子発現データやサンプル情報のデータフレームを操作する際には、列の選択 (select()
や mutate()
) やフィルタリング (filter()
) などの関数を駆使することが求められます。
本記事では、tidyverse の dplyr
に含まれる all_of()
および any_of()
関数の基本的な使い方と、それらがバイオデータ解析でどのように役立つのか を解説します。
1. all_of() と any_of() とは?
all_of()
と any_of()
は、dplyr
の select()
などの関数内で使われるヘルパー関数です。
all_of()
:指定したすべての列名がデータフレームに存在する場合に、その列を選択します。存在しない列があるとエラーになります。any_of()
:指定した列名のうち、データフレームに存在する列だけを選択します。存在しない列があってもエラーになりません。
この違いを理解することで、動的にカラムを選択する際に、エラーを防ぐことができます。
2. all_of() の基本的な使い方
2.1 all_of() を使って特定の列を選択する
all_of()
は 指定した列がすべて存在する場合にのみ動作 するため、事前に列があることが保証されている場合に使います。
library(tidyverse)
# サンプルデータの作成(遺伝子発現データを想定)
df <- tibble(
sample_id = c("S1", "S2", "S3"),
gene_A = c(1.2, 2.3, 1.8),
gene_B = c(0.5, 1.2, 0.9),
gene_C = c(2.1, 1.8, 2.5)
)
# 選択する列を指定
selected_genes <- c("gene_A", "gene_B")
# all_of() を使って列を選択
df_selected <- df %>% select(all_of(selected_genes))
print(df_selected)
実行結果
# A tibble: 3 × 2
gene_A gene_B
<dbl> <dbl>
1 1.2 0.5
2 2.3 1.2
3 1.8 0.9
このように、selected_genes
に指定した列がすべて df
に存在するため、問題なく動作します。
2.2 存在しない列を指定するとエラーになる
all_of()
は 存在しない列があるとエラーになる ため、以下のコードはエラーを引き起こします。
selected_genes <- c("gene_A", "gene_X") # gene_X は存在しない
df_selected <- df %>% select(all_of(selected_genes))
エラー例
Error: Can't subset columns that don't exist.
all_of()
は、指定した列がデータフレームに含まれていることを確認した上で使う必要があります。
3. any_of() の基本的な使い方
3.1 any_of() を使って存在する列だけを選択する
一方、any_of()
は 存在する列だけを選択し、存在しない列は無視 するため、エラーが発生しません。
selected_genes <- c("gene_A", "gene_X") # gene_X は存在しない
df_selected <- df %>% select(any_of(selected_genes))
print(df_selected)
実行結果
# A tibble: 3 × 1
gene_A
<dbl>
1 1.2
2 2.3
3 1.8
このように、gene_X
は df
に存在しないため無視され、存在する gene_A
のみが選択される という動作になります。
3.2 any_of() はデータに応じて列名が変わる場合に便利
バイオインフォマティクスの解析では、データセットごとに含まれる遺伝子の種類が異なることが多いため、列名が事前に固定されていない場合 に any_of()
を使うとエラーを回避できます。
例えば、RNA-seq データの解析で、異なる実験ごとに遺伝子名が異なる場合でも any_of()
を使えば安全に処理できます。
4. all_of() と any_of() の応用例
4.1 mutate() で特定の列の計算をする
mutate()
でも all_of()
や any_of()
を活用できます。
df_mutated <- df %>%
mutate(total_expression = rowSums(select(., any_of(c("gene_A", "gene_B", "gene_C")))))
print(df_mutated)
遺伝子発現データの合計値 を求める際に、列が存在するかどうか気にせず any_of()
を使うことで、安全に処理できます。
4.2 filter() で動的な条件を設定する
フィルタリングにも活用できます。
df_filtered <- df %>%
filter(if_any(any_of(c("gene_A", "gene_C")), ~ .x > 1.5))
print(df_filtered)
このコードでは、gene_A
の値が 1.5
を超える行だけを抽出しますが、gene_A
が存在しない場合にはエラーを回避できます。
5. まとめ
関数名 | 挙動 |
---|---|
all_of() | 指定したすべての列が存在する場合のみ動作(存在しない列があるとエラー) |
any_of() | 存在する列だけを選択し、存在しない列は無視(エラーにならない) |
all_of() はこんなときに使う
✅ 解析対象のカラムがすべて確実に存在する場合
✅ データの完全性を保証する必要がある場合(欠損カラムがあればエラーを出したいとき)
any_of() はこんなときに使う
✅ データごとに存在するカラムが異なる場合
✅ 列の欠損があっても処理を続けたい場合
バイオインフォマティクスのデータ解析では、実験ごとに異なるカラム構成になることが多いため、安全に処理を進めるには any_of()
を活用するのがベスト です。一方で、解析の完全性を重視するなら all_of()
を適切に使うと良いでしょう!!
all_of()
と any_of()
を理解して、データ解析をより効率的に進めましょう〜!