R tidyverse:列の値を次の行の値にシフト「lead関数」の使い方

スポンサーリンク

バイオインフォマティクスのデータ解析では、Rのtidyverseパッケージ群が非常に有用です。特に、dplyrはデータ操作の強力なツールを提供し、遺伝子発現データやその他のバイオデータの前処理に役立ちます。本記事では、dplyrlead()関数に焦点を当て、その基本的な使い方を解説します。


1. lead()関数とは?

lead()関数は、指定した列の値を次の行の値にシフトさせる機能を持っています。これは、時間的な遷移を伴うデータや、次の観測値との比較を行う際に便利です。

構文

lead(x, n = 1, default = NA, order_by = NULL)
  • x:シフトさせる対象のベクトルまたはデータフレームの列
  • n:シフトする行数(デフォルトは1)
  • default:データの末尾に補填する値(デフォルトはNA
  • order_by:並び替えを指定する列(データの順序を変えたい場合に使用)

lead()の逆の機能を持つのがlag()で、前の行の値を取得するのに使われます。


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

例1:シンプルなlead()の使用

まずは基本的な動作を見てみましょう。

library(dplyr)

# サンプルデータ
df <- tibble(
  time = 1:5,
  value = c(10, 20, 30, 40, 50)
)

# lead()を適用
df %>% mutate(next_value = lead(value))

出力

# A tibble: 5 × 3
   time value next_value
  <int> <dbl>      <dbl>
1     1    10         20
2     2    20         30
3     3    30         40
4     4    40         50
5     5    50         NA

このように、lead(value)を適用すると、各行のvalue1行先の値にシフトされ、新しい列next_valueに格納されます。最終行は次の値がないため、NAになります。


例2:複数行シフト

引数nを指定すると、シフトする行数を変更できます。

df %>% mutate(next_value_2 = lead(value, 2))

出力

# A tibble: 5 × 3
   time value next_value_2
  <int> <dbl>        <dbl>
1     1    10           30
2     2    20           40
3     3    30           50
4     4    40           NA
5     5    50           NA

n = 2と指定すると、2行先の値を取得し、末尾の2行はNAになります。


例3:デフォルト値の指定

default引数を使うと、末尾に埋める値を指定できます。

df %>% mutate(next_value_filled = lead(value, default = 0))

出力

# A tibble: 5 × 3
   time value next_value_filled
  <int> <dbl>            <dbl>
1     1    10               20
2     2    20               30
3     3    30               40
4     4    40               50
5     5    50                0

末尾のNA0に置き換わっていることがわかります。


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

例4:遺伝子発現データの時間推移

バイオデータでは、遺伝子発現の時間的変化を調べる際にlead()が有効です。例えば、以下のようなデータを考えます。

gene_data <- tibble(
  time = 1:6,
  expression = c(2.3, 2.8, 3.5, 3.9, 4.2, 4.5)
)

gene_data %>%
  mutate(expression_change = lead(expression) - expression)

出力

# A tibble: 6 × 3
   time expression expression_change
  <int>      <dbl>             <dbl>
1     1        2.3               0.5
2     2        2.8               0.7
3     3        3.5               0.4
4     4        3.9               0.3
5     5        4.2               0.3
6     6        4.5              NA

この例では、各時点の遺伝子発現量と、次の時点との変化量を計算しました。


例5:動的閾値の設定

遺伝子発現データの分析では、一定のしきい値を超えた場合に何かしらの処理を施すことがあります。lead()を使って「次の値が特定の閾値を超えているか」をチェックできます。

threshold <- 4.0

gene_data %>%
  mutate(
    next_expression = lead(expression),
    exceed_threshold = next_expression > threshold
  )

出力

# A tibble: 6 × 3
   time expression next_expression exceed_threshold
  <int>      <dbl>           <dbl>           <lgl>
1     1        2.3             2.8           FALSE
2     2        2.8             3.5           FALSE
3     3        3.5             3.9           FALSE
4     4        3.9             4.2            TRUE
5     5        4.2             4.5            TRUE
6     6        4.5            NA             NA

このように、次の値が4.0を超えているかどうかを論理値(TRUE/FALSE)で判定できます。


4. まとめ

lead()関数は、データを1行先にシフトすることで、時間的な変化の分析閾値判定を容易にする便利な関数です。
特にバイオインフォマティクスでは、遺伝子発現データの変化を追跡する場面で活用できます!!

ポイントの復習

lead(x, n)xの値をn行先にシフト
lead(x, default = val):末尾のNAを特定の値で埋める
lead()を使って時間的変化や閾値判定を行う

tidyverseの力を活用し、バイオデータ解析をより効率的に進めていきましょう〜!

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