Rのtidyverse~行の条件抽出「filter」の使い方

スポンサーリンク

dplyr の filter() の基本と応用

バイオインフォマティクスでは、大規模なデータセットを効率よく処理するために R の tidyverse が非常に有用です。特に、dplyr はデータの操作を直感的に記述できる強力なパッケージであり、遺伝子発現データやシークエンスデータの解析で頻繁に使われます。

本記事では、dplyr の filter() 関数 に焦点を当て、基本的な使い方から応用までを解説します。バイオインフォマティクスの具体的なデータ例も交えて説明するので、ぜひ参考にしてください!


1. filter() の基本

filter() とは?

filter() は、データフレームから条件に合う行だけを抽出する関数です。SQL の WHERE 句のようなイメージで使えます。

使い方

library(dplyr)

# サンプルデータ
df <- tibble(
  Sample = c("A", "B", "C", "D", "E"),
  Gene = c("BRCA1", "TP53", "EGFR", "KRAS", "MYC"),
  Expression = c(8.5, 2.3, 5.7, 10.2, 4.8)
)

# Expression > 5 の行を抽出
filtered_df <- df %>% filter(Expression > 5)

print(filtered_df)

出力

# A tibble: 3 × 3
  Sample Gene  Expression
  <chr>  <chr>      <dbl>
1 A      BRCA1        8.5
2 C      EGFR         5.7
3 D      KRAS        10.2

このように、条件を満たす行のみが抽出されます。


2. 複数条件の指定

AND 条件(& または , を使用)

filter() では、複数の条件を組み合わせることもできます。例えば、特定の遺伝子の発現量が閾値以上で、かつ特定の遺伝子である場合などです。

filtered_df <- df %>% filter(Expression > 5 & Gene != "KRAS")
print(filtered_df)

または、, を使って書くこともできます。

filtered_df <- df %>% filter(Expression > 5, Gene != "KRAS")

OR 条件(| を使用)

OR 条件を使うと、どちらか一方の条件を満たすデータを抽出できます。

filtered_df <- df %>% filter(Gene == "BRCA1" | Gene == "MYC")
print(filtered_df)

!= で特定の値を除外

特定の値を除外したい場合は != を使用します。

filtered_df <- df %>% filter(Gene != "TP53")

これは “TP53” を含まないデータ を抽出します。


3. filter() の応用:バイオインフォマティクスの実例

(1) RNA-Seq データのフィルタリング

RNA-Seq の発現データには、多くのノイズや低発現の遺伝子が含まれます。以下のように、ある閾値以上の発現量を持つ遺伝子だけを抽出できます。

rna_data <- tibble(
  Gene = c("BRCA1", "TP53", "EGFR", "KRAS", "MYC", "GAPDH"),
  Expression = c(8.5, 2.3, 5.7, 10.2, 4.8, 12.0)
)

# 発現量が5以上の遺伝子のみ抽出
filtered_rna <- rna_data %>% filter(Expression >= 5)
print(filtered_rna)

(2) 変異データのフィルタリング

例えば、変異データセットから 「病原性が ‘high’ の変異だけを抽出」 する場合、以下のように filter() を活用できます。

mutation_data <- tibble(
  Sample = c("S1", "S2", "S3", "S4", "S5"),
  Gene = c("BRCA1", "TP53", "EGFR", "KRAS", "MYC"),
  Pathogenicity = c("high", "low", "moderate", "high", "low")
)

# 病原性が high の変異のみ抽出
filtered_mutations <- mutation_data %>% filter(Pathogenicity == "high")
print(filtered_mutations)

(3) filter() と %in% を活用したサブセット抽出

特定の遺伝子セットに含まれるデータだけを抽出したい場合、%in% を使うと便利です。

target_genes <- c("BRCA1", "EGFR", "KRAS")

filtered_df <- df %>% filter(Gene %in% target_genes)
print(filtered_df)

このコードは、リスト内の遺伝子だけを抽出 します。


4. filter() のパフォーマンス向上のヒント

(1) filter() は最初に適用する

データが大きい場合、filter() はできるだけ データ処理の最初に適用 すると計算負荷が減ります。

df %>% 
  filter(Expression > 5) %>%
  arrange(desc(Expression)) %>%
  select(Sample, Gene)

このように、フィルタリング → 並べ替え → 必要な列を選択 の順で処理すると効率的です。


(2) filter() の後に collect() を使う(データベースの場合)

SQL データベースと連携している場合、filter()データベース側で処理 されるため、高速になります。しかし、データをローカルで処理する場合は collect() を使ってデータを取得しましょう。

filtered_data <- df %>% filter(Expression > 5) %>% collect()

まとめ

filter()バイオインフォマティクスのデータ解析で非常に役立つ関数 です!!

ポイント

filter() は条件に合う行だけを抽出できる
&(AND)や |(OR)を使って複数条件を指定可能
✅ RNA-Seq や変異データの解析で便利
%in% を使うとリストのサブセットを簡単に抽出可能
✅ データベース連携時は collect() を活用

バイオインフォマティクスにおける tidyverse の活用をさらに深めて、効率的なデータ解析を実現しましょう〜!

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