バイオインフォマティクスのデータ解析では、大量の数値データを扱うことが一般的です。遺伝子発現データやサンプル測定データなど、多くの列を一括で処理する必要がある場面が頻繁にあります。
そんなときに役立つのが、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()
で列名を簡単に変更
これらのテクニックを活用し、データ解析の効率を向上させましょう〜!