R の mutate 関数: データフレームに列を追加する

UB3/informatics/r/mutate

このページの最終更新日: 2024/09/30

  1. 概要: mutate() 関数の基本的な使い方
  2. if_else: mutate() 関数で、条件を指定して列を追加する
  3. str_detect: 特定の文字列を含むかどうかで真偽を判別する
  4. str_sub: 他の列から部分抽出する
  5. それぞれの行の最大値の列を追加する
  6. 通し番号を追加する

広告

概要: mutate() 関数の基本的な使い方

R の mutate() 関数は、tidyverse パッケージ に含まれる関数である。データフレーム に列を追加する。

組み込みデータセット の ToothGrowth を使ってみよう。

ToothGrowthデータセット

基本的な使い方は、mutate(データセット, 列名 = 条件) である。

単純に一つの値を追加する場合。

ToothGrowthデータセット mutate関数 ToothGrowthデータセット mutate関数

既存の列を使用。len という列の 2 倍の数値をもつ列を作成。

ToothGrowthデータセット mutate関数

これらの例は、分かりやすいようでいて、実はけっこう分かりにくい。df2 の例では、追加するベクターの長さが 1 であるのに対し、df3 で追加しているのは len と同じ長さ (つまり、ToothGrowth の行数と同じ長さ) をもつベクターである。

df3 の方はわかる。新しい列をデータフレームに足すのだから、行の数が同じにならなければいけない通りである。

実は mutate() 関数にはリサイクル機能があり、 指定したベクトルの長さがデータフレームの行数より少ない場合、データフレームの行数に合わせるという作業をする (1)。便利な場合もあるのだが、予期しない結果を生む場合があるので、頭の隅に留めておきたい。

if_else: mutate() 関数で、条件を指定して列を追加する

条件指定には、if_else を使う方法が便利である。if_else(条件式, true = 真の場合の値, false = 偽の場合の値) とする。

ToothGrowthデータセット mutate関数

二つの列が同一かどうかを調べるには、if_else(列1 == 列2, true = 0, false = 1) として新しい列を作成し、その列の合計値や最大値を求めればよい。

条件分岐していく場合の書き方

場合分けを重ねていく場合には、false のところに次の if_else が来るように書く

以下の例では、まず len が 10 より大きいかを調べ、真なら Long を記入。偽の場合は、次に 8 より大きいかを調べる。ここで 10 > len > 8 と書きたくなるかもしれないが、最初の判定で 10 より小さいことはわかっているので、len > 8 のみで十分である。10 > len > 8 と指定してしまうと、スクリプトがエラーになるだけでなく、理論的に値がちょうど 10 のときに判定できなくなる。

8 より大きい場合には Middle、そうでない場合は Short となる。最後の , false = の位置が間違いやすいので注意。最後の if_else のカッコの中に入る。

ToothGrowthデータセット mutate関数

str_detect: 特定の文字列を含むかどうかで真偽を判別する

特定の文字列を含むかどうかで判別するときは、str_detect と組み合わせる。以下のスクリプトで, supp が VC を含む場合は TURE、そうでない場合は FALSE という列が追加される。

ToothGrowthデータセット mutate関数

str_sub: 他の列から部分抽出する

部分抽出なので、ベクターの取り扱い とも共通部分が多い。supp の列の 1 文字目を抽出している。後ろから抽出する場合はマイナスをつける。

ToothGrowthデータセット mutate関数

それぞれの行の最大値の列を追加する

もちろん、これが唯一の方法ではない。rowwise() は推奨されないと書いてあるページもあった。詳細は データフレームで各行の最大値を取得する を参照のこと。

通し番号を追加する

行の数と同じ番号を指定する。


広告

References

  1. 【R前処理講座16】{dplyr} mutate:列の追加【tidyverse】 Link: Last access 2024/03/28.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。