テーブルに列を変更、追加する
読み込んだデータのテーブルに含まれる列の値を変更するには、 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万行になっても、同じ書き方で対応できるのが、プログラムを使う利点です。
この記事が気に入ったらサポートをしてみませんか?