R tidyverse:列の選択「指定したすべての列 all_of」 と 「存在する列だけany_of()」 の使い方

スポンサーリンク

バイオインフォマティクスの解析には、tidyversedplyr パッケージが非常に便利です。特に、遺伝子発現データやサンプル情報のデータフレームを操作する際には、列の選択 (select()mutate()) やフィルタリング (filter()) などの関数を駆使することが求められます。

本記事では、tidyverse の dplyr に含まれる all_of() および any_of() 関数の基本的な使い方と、それらがバイオデータ解析でどのように役立つのか を解説します。


1. all_of() と any_of() とは?

all_of()any_of() は、dplyrselect() などの関数内で使われるヘルパー関数です。

  • 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_Xdf に存在しないため無視され、存在する 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() を理解して、データ解析をより効率的に進めましょう〜!

タイトルとURLをコピーしました