Rのtidyverse:データフレームの先頭(上位)の行を抽出 「slice_head() / slice_tail()」 の使い方

スポンサーリンク

バイオインフォマティクスのデータ解析では、遺伝子発現データやゲノム情報など、大量のデータを効率的に処理するスキルが求められます。そんな中で、Rのtidyverseパッケージは、データ処理の強力なツールとして広く利用されています。特に、dplyr はデータ操作を簡潔に記述できる便利なパッケージです。

今回は、dplyrslice_head()slice_tail() について解説し、バイオインフォマティクスのデータ解析でどのように活用できるかを紹介します。


1. slice_head() と slice_tail() の基本

1.1 slice_head() の基本

slice_head() は、データフレームの先頭(上位)の行を抽出する関数です。n で行数を指定するか、prop でデータ全体の割合を指定できます。

構文

slice_head(.data, n = NULL, prop = NULL, by = NULL)

使用例

library(dplyr)

# サンプルデータ
df <- tibble(
  Gene = c("GeneA", "GeneB", "GeneC", "GeneD", "GeneE"),
  Expression = c(8.2, 5.1, 9.3, 3.4, 7.8)
)

# 上位3行を取得
df %>% slice_head(n = 3)

出力

# A tibble: 3 × 2
  Gene  Expression
  <chr>      <dbl>
1 GeneA        8.2
2 GeneB        5.1
3 GeneC        9.3

また、データの一部(割合)を取得する場合:

df %>% slice_head(prop = 0.4)

これは、データの 40%(5行のうち2行)を取得します。


1.2 slice_tail() の基本

slice_tail() は、データフレームの末尾(下位)の行を抽出する関数で、slice_head() と対になる関数です。

構文

slice_tail(.data, n = NULL, prop = NULL, by = NULL)

使用例

df %>% slice_tail(n = 2)

出力

# A tibble: 2 × 2
  Gene  Expression
  <chr>      <dbl>
1 GeneD        3.4
2 GeneE        7.8

prop を使うと、データの末尾の一定割合を取得できます。

df %>% slice_tail(prop = 0.4)

2. バイオインフォマティクスでの応用

2.1 遺伝子発現データのトップNを取得

遺伝子発現データを扱う際に、発現量の多い遺伝子(上位N個)や少ない遺伝子(下位N個)を取得することはよくあります。

# 発現量の高い上位3遺伝子を取得
df %>%
  arrange(desc(Expression)) %>%
  slice_head(n = 3)

出力

# A tibble: 3 × 2
  Gene  Expression
  <chr>      <dbl>
1 GeneC        9.3
2 GeneA        8.2
3 GeneE        7.8

逆に、発現量が低い遺伝子を取得したい場合:

df %>%
  arrange(Expression) %>%
  slice_head(n = 3)

2.2 グループごとにトップNを取得

例えば、異なる条件(異なる実験条件やサンプルごとのデータ)で、各グループの発現量が高い遺伝子を抽出したい場合、by を活用できます。

df_grouped <- tibble(
  Sample = rep(c("Control", "Treatment"), each = 5),
  Gene = c("GeneA", "GeneB", "GeneC", "GeneD", "GeneE", 
           "GeneA", "GeneB", "GeneC", "GeneD", "GeneE"),
  Expression = c(8.2, 5.1, 9.3, 3.4, 7.8, 12.1, 10.5, 13.4, 6.2, 11.3)
)

# 各グループごとに発現量の上位2つの遺伝子を取得
df_grouped %>%
  group_by(Sample) %>%
  arrange(desc(Expression)) %>%
  slice_head(n = 2)

出力

# A tibble: 4 × 3
# Groups:   Sample [2]
  Sample    Gene  Expression
  <chr>     <chr>      <dbl>
1 Control   GeneC        9.3
2 Control   GeneA        8.2
3 Treatment GeneC       13.4
4 Treatment GeneA       12.1

slice_tail(n = 2) を使えば、発現量の低い遺伝子を取得できます。


2.3 組み合わせてデータ解析を効率化

発現データのフィルタリングだけでなく、異常値の検出やデータの要約にも使えます。

例えば、発現量が異常に高い遺伝子(上位1%)や異常に低い遺伝子(下位1%)をフィルタリングするには、以下のようにします。

threshold_top <- quantile(df$Expression, 0.99) # 上位1%の閾値
threshold_bottom <- quantile(df$Expression, 0.01) # 下位1%の閾値

df %>%
  filter(Expression >= threshold_top | Expression <= threshold_bottom)

これは、発現が極端な遺伝子を取り除く前処理に役立ちます。


3. まとめ

  • slice_head(n = x) はデータの先頭x行を取得
  • slice_tail(n = x) はデータの末尾x行を取得
  • arrange() と組み合わせることで、発現量の高い/低い遺伝子を簡単に抽出
  • group_by() を使うと、グループごとにトップN/ボトムNを取得可能
  • 分析の前処理や異常値の検出にも応用できる

4. おわりに

バイオインフォマティクスでは、大量のデータから必要な情報を効率的に抽出することが重要です。slice_head()slice_tail() を活用すれば、発現データのフィルタリングや統計解析をスムーズに行えます!!

tidyverse の dplyr を駆使して、より高度なデータ解析にチャレンジしてみましょう〜!

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