見出し画像

テーブルに列を変更、追加する

読み込んだデータのテーブルに含まれる列の値を変更するには、 mutate() 関数を使います。列を追加することも、この変更の1つとして実行できます。

足し算して更新(上書き)

下記のようなテーブルがあったとします。id1 から id3 のそれぞれに、Sample1 と Sample2 の2つの数値があるというものです。

> input_data
# A tibble: 3 × 3
  Id    Sample1 Sample2
  <chr>   <dbl>   <dbl>
1 id1         1       4
2 id2         2       5
3 id3         3       6

id1 から id3 の Sample1 について、すべてに1を加える変更を行うには、 mutate() を使って、mutate("Sample" = Sample1 +1) と書けます。
「Sample1」 を 「Sample1 + 1」で上書きするというイメージです。

> input_data %>% mutate("Sample1" = Sample1 + 1)
# A tibble: 3 × 3
  Id    Sample1 Sample2
  <chr>   <dbl>   <dbl>
1 id1         2       4
2 id2         3       5
3 id3         4       6

*上記の実行結果は、 mutate() で処理した結果を表示させているだけです。input_data には影響を与えません。結果を残したいのであれば、下記のようにします。(結果を result_data に格納する。)

result_data <- input_data %>% mutate("Sample1" = Sample1 + 1)

列を追加する

では、Sample2 は、Sample1 の何倍になっているか、ratio を算出して、その結果を新たな列に入れてみましょう。 mutate("Ratio" = Sample2 / Sample1) となります。もとの input_data に「Ratio」という列はありません。その場合、新たに「Ratio」という列が追加され、そこに計算結果が入ります。

> input_data %>% mutate("Ratio" = Sample2 / Sample1)
# A tibble: 3 × 4
  Id    Sample1 Sample2 Ratio
  <chr>   <dbl>   <dbl> <dbl>
1 id1         1       4   4
2 id2         2       5   2.5
3 id3         3       6   2

新たな列を追加していることを明示するために Ratio をダブルクォーテーション (") で囲んでいます。(ほかに Ratio という変数がなければ、囲まなくても動作します。)

id1 について、Sample2 / Sample1 を計算して、次は id2 について、Sample2 / Sample1 を計算、と何回も同じ命令を書かなくても、 Ratio = Sample2 / Sample1 とシンプルに書けていることが分かるかと思います。プログラミング言語でよくある for 文で回す必要もありません。この辺りがR言語の得意とするところです。

平均値の列を追加する

Ratio に続いて、Sample1 と Sample2 の「平均値」の列を追加してみましょう。まずは、平均値を計算する前に、Id の列が邪魔なので、データだけのオブジェクトを作っておきます。必要な列を選択する作業なので、select() 関数が使えます。

> samples <- input_data %>% select(-Id)
> samples
# A tibble: 3 × 2
  Sample1 Sample2
    <dbl>   <dbl>
1       1       4
2       2       5
3       3       6
>

*クラシックな書き方で、 input_data[,-1] と書いても良いです。短い表現で便利ですが、後でプログラムを読み直す時に、select のほうが理解しやすいと思います。

通常、平均値を算出する関数は、mean() ですが、今回は、rowMeans() 関数を使います。それぞれの行 (row) について、平均値 (mean) を計算する関数です。mutate("Ave" = rowMeans(samples)) と先ほどの samples を rowMeans() に指定します。

> input_data %>% mutate("Ave" = rowMeans(samples))
# A tibble: 3 × 4
  Id    Sample1 Sample2   Ave
  <chr>   <dbl>   <dbl> <dbl>
1 id1         1       4   2.5
2 id2         2       5   3.5
3 id3         3       6   4.5
>

*読みやすさを考えなければ、 mutate("Ave" = rowMeans(input_data[,-1])) とも書けます。

これまでの処理を続けて書くと、下記のようになります。

result_data <- input_data %>%
  mutate("Ratio" = Sample2 / Sample1) %>%
  mutate("Ave" = rowMeans(samples))

結果は、result_data に格納されます。

> result_data
# A tibble: 3 × 5
  Id    Sample1 Sample2 Ratio   Ave
  <chr>   <dbl>   <dbl> <dbl> <dbl>
1 id1         1       4   4     2.5
2 id2         2       5   2.5   3.5
3 id3         3       6   2     4.5

さらに、filter() でフィルタリングしたり、arrange() でソートしたり、必要な状態に加工していくことができます。データの行が増えて、2万行になっても、100万行になっても、同じ書き方で対応できるのが、プログラムを使う利点です。


この記事が気に入ったらサポートをしてみませんか?