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 の活用をさらに深めて、効率的なデータ解析を実現しましょう〜!