R tidyverse:特定の連番カラムを一括で選択「num_range」の使い方

スポンサーリンク

バイオインフォマティクスのデータ解析では、大量の数値データを扱うことが一般的です。遺伝子発現データやサンプル測定データなど、多くの列を一括で処理する必要がある場面が頻繁にあります。
そんなときに役立つのが、dplyrnum_range()関数です。これは、連番の列名をパターンマッチングでまとめて選択・操作できる便利な関数です。

本記事では、num_range()の基本的な使い方から、バイオインフォマティクスの応用例まで詳しく解説します。


1. num_range()とは?

num_range()の概要

num_range()は、dplyrselect()と組み合わせて使い、特定の連番のカラム(列)を一括で選択するための関数です。
例えば、遺伝子発現データでGene_1, Gene_2, ..., Gene_10のような列がある場合、手動で選択するのは面倒ですが、num_range()を使えば簡単に指定できます。

基本構文

num_range(prefix, range, width = NULL)
  • prefix: 列名の共通の接頭辞(プレフィックス)
  • range: 数値の範囲(ベクトル形式)
  • width: 桁数を指定(NULLの場合は自動判定)

2. num_range()の基本的な使い方

例1: 連番の列を選択する

以下のようなデータフレームを考えます。

library(tidyverse)

# 仮のデータフレーム
df <- tibble(
  SampleID = c("S1", "S2", "S3"),
  Gene_1 = c(5, 10, 15),
  Gene_2 = c(20, 25, 30),
  Gene_3 = c(35, 40, 45),
  Other = c("A", "B", "C")
)

df

出力:

# A tibble: 3 × 5
  SampleID Gene_1 Gene_2 Gene_3 Other
  <chr>    <dbl>  <dbl>  <dbl> <chr>
1 S1           5     20     35 A
2 S2          10     25     40 B
3 S3          15     30     45 C

Gene_1からGene_3の列だけを選択する場合、通常のselect()を使うと、次のように書く必要があります。

df_selected <- df %>%
  select(Gene_1, Gene_2, Gene_3)

これを、num_range()を使うと、より簡潔に記述できます。

df_selected <- df %>%
  select(num_range("Gene_", 1:3))

df_selected

出力:

# A tibble: 3 × 3
  Gene_1 Gene_2 Gene_3
  <dbl>  <dbl>  <dbl>
1     5     20     35
2    10     25     40
3    15     30     45

ポイント:

  • num_range("Gene_", 1:3)とすることで、Gene_1からGene_3を一括で選択可能。

3. num_range()の応用

(1) 複数の範囲を指定

例えば、Gene_1からGene_3と、Gene_6からGene_8を選択したい場合、次のように記述できます。

df_selected <- df %>%
  select(num_range("Gene_", c(1:3, 6:8)))

範囲を自由に設定できるので、特定の遺伝子データを抽出する際に便利です。


(2) mutate()と組み合わせて一括処理

例えば、Gene_1からGene_3の値を2倍にする場合、通常のコードでは次のように書くことになります。

df_mutated <- df %>%
  mutate(Gene_1 = Gene_1 * 2,
         Gene_2 = Gene_2 * 2,
         Gene_3 = Gene_3 * 2)

これを、mutate(across())num_range()を使って一括処理できます。

df_mutated <- df %>%
  mutate(across(num_range("Gene_", 1:3), ~ .x * 2))

df_mutated

出力:

# A tibble: 3 × 5
  SampleID Gene_1 Gene_2 Gene_3 Other
  <chr>    <dbl>  <dbl>  <dbl> <chr>
1 S1          10     40     70 A
2 S2          20     50     80 B
3 S3          30     60     90 C

(3) rename_with()と組み合わせて列名変更

大量の連番列を扱う際、列名を変更することがよくあります。
例えば、Gene_1からGene_3の列名をExp_1からExp_3に変更するには、rename_with()num_range()を組み合わせると簡単です。

df_renamed <- df %>%
  rename_with(~ gsub("Gene_", "Exp_", .x), num_range("Gene_", 1:3))

df_renamed

出力:

# A tibble: 3 × 5
  SampleID Exp_1 Exp_2 Exp_3 Other
  <chr>    <dbl> <dbl> <dbl> <chr>
1 S1           5    20    35 A
2 S2          10    25    40 B
3 S3          15    30    45 C

4. バイオインフォマティクスでの活用例

(1) 遺伝子発現データの処理

遺伝子発現データ(RNA-seqデータなど)は、多くのサンプルを含むことが一般的です。
Gene_1からGene_1000のようなデータに対して、num_range()を使うと、一括処理が容易になります。

例えば、特定の範囲の遺伝子のみを抽出したい場合:

df_selected <- df %>%
  select(SampleID, num_range("Gene_", 1:50))  # Gene_1 から Gene_50 を抽出

(2) 大量の測定データの正規化

バイオデータの前処理では、データを**標準化(正規化)**することが多いです。

df_normalized <- df %>%
  mutate(across(num_range("Gene_", 1:1000), ~ (.x - mean(.x)) / sd(.x)))

これにより、1000個の列を一括で正規化できます。


まとめ

num_range()は、連番のカラムを一括処理するのに便利な関数です。
特に、バイオインフォマティクスでの遺伝子発現データの整理・処理に大いに役立ちます!!

  • select()と組み合わせて特定の列を抽出
  • mutate(across())と組み合わせて一括変換
  • rename_with()で列名を簡単に変更

これらのテクニックを活用し、データ解析の効率を向上させましょう〜!

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