Rのtidyverse:最大・最小の行を抽出する「slice_min・slice_max」の使い方

スポンサーリンク

バイオインフォマティクスでは、大量のデータを効率的に処理するためのツールが不可欠です。その中で、Rのtidyverse は、データの整形や解析を直感的かつ強力に行うためのパッケージ群として広く利用されています。

本記事では、tidyverseのdplyrパッケージ に含まれる slice_minslice_max 関数について解説し、その応用方法をバイオインフォマティクスの視点から紹介します。

1. slice_min・slice_maxとは?

slice_min() および slice_max() は、指定した列の最小・最大の値を持つ行を抽出する 関数です。データフレームの行数が膨大な場合でも、効率的に特定のデータを取得できます。

基本的な使い方

slice_min(.data, order_by, n = 1, with_ties = TRUE)

  • order_by: 並び替えの基準となる列
  • n: 取得する行数(デフォルトは1)
  • with_ties: 同じ値を持つ行をすべて含めるか(デフォルトは TRUE

slice_max(.data, order_by, n = 1, with_ties = TRUE)

  • slice_min() の逆で、最大値を持つ行を取得

基本例

まず、架空のバイオインフォマティクスデータを用意します。

library(dplyr)

# 遺伝子発現データの例
gene_expression <- tibble(
  gene = c("GeneA", "GeneB", "GeneC", "GeneD", "GeneE"),
  expression_level = c(12.3, 45.6, 8.9, 67.8, 45.6)
)

# 最小の発現レベルの遺伝子を取得
gene_expression %>% slice_min(order_by = expression_level)

# 最大の発現レベルの遺伝子を取得
gene_expression %>% slice_max(order_by = expression_level)

出力:

# slice_min の結果
# gene  expression_level
# GeneC  8.9

# slice_max の結果
# gene  expression_level
# GeneD  67.8

このように、slice_min で最小の値(8.9)、slice_max で最大の値(67.8)を持つ行を取得できます。

2. 応用例

バイオインフォマティクスのデータ解析では、特定の条件に合う遺伝子やサンプルを抽出する場面が多々あります。ここでは、応用的な使い方をいくつか紹介します。

応用1:複数の最小・最大値を取得

例えば、上位3つの遺伝子を取得する場合は n = 3 を指定します。

# 上位3つの遺伝子を取得
gene_expression %>% slice_max(order_by = expression_level, n = 3)

出力:

# gene  expression_level
# GeneD  67.8
# GeneB  45.6
# GeneE  45.6

発現量が同じ遺伝子 (GeneBGeneE) も含まれます。

応用2:特定の条件でグループごとに最小・最大値を取得

異なるサンプル間での遺伝子発現データを解析する場合、グループごとに最大・最小の遺伝子を抽出 することが重要です。

# サンプルごとに最大発現の遺伝子を取得
gene_expression_grouped <- tibble(
  sample = c("Sample1", "Sample1", "Sample2", "Sample2", "Sample3"),
  gene = c("GeneA", "GeneB", "GeneC", "GeneD", "GeneE"),
  expression_level = c(12.3, 45.6, 8.9, 67.8, 45.6)
)

# サンプルごとの最大発現遺伝子
gene_expression_grouped %>%
  group_by(sample) %>%
  slice_max(order_by = expression_level)

出力:

# sample   gene  expression_level
# Sample1  GeneB  45.6
# Sample2  GeneD  67.8
# Sample3  GeneE  45.6

このように、各サンプルごとに最大発現の遺伝子を簡単に取得できます。

応用3:RNA-Seqデータの解析

RNA-Seqデータでは、発現量の高い遺伝子をリストアップすることで、重要なバイオマーカーの特定に役立ちます。

例えば、DESeq2 で正規化した発現データ normalized_counts から、最も発現量が高いトップ10の遺伝子を抽出する方法は以下のようになります。

# RNA-Seqの正規化発現データ (仮)
rna_seq_data <- tibble(
  gene = paste0("Gene", 1:100),
  expression_level = runif(100, min = 0, max = 1000)  # 0から1000のランダム値
)

# 発現量の高いトップ10の遺伝子を取得
rna_seq_data %>% slice_max(order_by = expression_level, n = 10)

このコードは、ランダムな発現データを用いて最も発現量の高い遺伝子10個を取得します。

3. filter() との違い

同じようにデータを抽出する方法として filter() がありますが、slice_minslice_max との違いは以下の通りです。

関数使い方
filter()特定の条件を満たす行を抽出filter(expression_level == min(expression_level))
slice_min() / slice_max()データの最小・最大値を自動で選択slice_min(order_by = expression_level, n = 1)

slice_minslice_max の方が、最小・最大値を簡単に取得できる点で優れています。

まとめ

slice_min()slice_max() は、データの最小・最大値を持つ行を効率的に取得できる 強力な関数です。バイオインフォマティクスにおいて、RNA-Seqデータの解析や特定の遺伝子の抽出など、多くの場面で活用できます!!

今回のポイント

  1. slice_min() は最小値、slice_max() は最大値を持つ行を取得
  2. n を指定すれば複数の行を取得可能
  3. group_by() と組み合わせることで、グループごとの解析が可能
  4. RNA-Seqデータ解析などバイオインフォマティクスの実データにも応用できる

Rのtidyverseを活用して、より効率的なデータ解析を実践してみてくださいね〜!

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