R (tidyverse), mutate 列を変更、追加

読み込んだデータに対して、演算した結果を格納したり、新たな列(データ)を追加するには、 mutate() 関数を使います。

テーブル %>% mutate(追加される列名 = 演算の式)

例えば、2つの列の結果から、ratio を算出して、その結果を格納する場合に使います。下記の例では、 Sample2 と Sample1 の列から ratio を求め、その結果を「Ratio」列に格納しています。新たに追加される列であるため、列名の Ratio をダブルクオーテーションで囲みます。

> raw_data
# A tibble: 3 x 5
  Id    Symbol Description   Sample1 Sample2
  <chr> <chr>  <chr>           <dbl>   <dbl>
1 id1   AAA    lorem ipsum a       1       4
2 id2   BBB    lorem ipsum b       2       5
3 id3   CCC    lorem ipsum c       3       6
>
>
> raw_data %>% mutate("Ratio" = Sample2 / Sample1)
# A tibble: 3 x 6
  Id    Symbol Description   Sample1 Sample2 Ratio
  <chr> <chr>  <chr>           <dbl>   <dbl> <dbl>
1 id1   AAA    lorem ipsum a       1       4   4
2 id2   BBB    lorem ipsum b       2       5   2.5
3 id3   CCC    lorem ipsum c       3       6   2

演算の式 (Sample2 / Sample1 ) が、それぞれの「行」に対して、適用されるようなイメージです。式には、関数も使えます。例えば、平均値を算出するには、 rowMeans() が使えます。

> samples <- raw_data %>% select(starts_with("Sample"))
> samples
# A tibble: 3 x 2
  Sample1 Sample2
    <dbl>   <dbl>
1       1       4
2       2       5
3       3       6
> # 数値だけのオブジェクトを準備
>
> raw_data %>% mutate("Ave" = rowMeans(samples))
# A tibble: 3 x 6
  Id    Symbol Description   Sample1 Sample2   Ave
  <chr> <chr>  <chr>           <dbl>   <dbl> <dbl>
1 id1   AAA    lorem ipsum a       1       4   2.5
2 id2   BBB    lorem ipsum b       2       5   3.5
3 id3   CCC    lorem ipsum c       3       6   4.5

計算の邪魔になるため、 Id などを除いた数値だけのオブジェクト (samples) を作成しておき、 これを rowMeans の引数としています。このパターンで記述しておくと、サンプル数が多くても、同じ表現で計算できます。

もちろん、パイプで連続した処理も可能です。

up_genes <- raw_data %>%
              mutate("Ratio" = Sample2 / Sample1) %>%
              mutate("Ave" = rowMeans(samples))   %>%
              select(Symbol, Ratio, Ave)          %>%
              filter(Ratio > 2)

> # 上記の実行結果
> up_genes
# A tibble: 2 x 3
  Symbol Ratio   Ave
  <chr>  <dbl> <dbl>
1 AAA      4     2.5
2 BBB      2.5   3.5
 

投稿者:

Atsushi Doi

株式会社セルイノベーター、主任研究員。理学博士。山口大学大学院理工学研究科修了。東京大学医科学研究所ヒトゲノム解析センターの特任助手を経て、株式会社GNIに主任研究員として勤務。その後、株式会社セルイノベーターの立ち上げに参加し、現在に至る。専門は、バイオインフォマティクス、おもにシステムバイオロジー。