バイオインフォマティクスのデータ解析では、大量の数値データを扱うことが一般的です。遺伝子発現データやサンプル測定データなど、多くの列を一括で処理する必要がある場面が頻繁にあります。
そんなときに役立つのが、dplyrのnum_range()関数です。これは、連番の列名をパターンマッチングでまとめて選択・操作できる便利な関数です。
本記事では、num_range()の基本的な使い方から、バイオインフォマティクスの応用例まで詳しく解説します。
1. num_range()とは?
num_range()の概要
num_range()は、dplyrのselect()と組み合わせて使い、特定の連番のカラム(列)を一括で選択するための関数です。
例えば、遺伝子発現データで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()で列名を簡単に変更
これらのテクニックを活用し、データ解析の効率を向上させましょう〜!
![バイオインフォ 道場 [bioinfo-Dojo]](https://bioinfo-dojo.net/wp-content/uploads/2016/03/some_object_luca-bravo-alS7ewQ41M8-unsplash.jpg)

