R言語でデータフレームに列を追加する方法について解説します。このような方法はいくつかあり、R言語に標準で搭載されている機能を使用した方法もありますが、ここではtidyverseパッケージに含まれているdplyrパッケージのmutate()を使用した方法についてお伝えします。mutate()を使用する利点は、パイプ演算子と親和性が高くR言語に標準で搭載されている機能を使用する方法よりも可読性が高いコードが書けることが挙げられます。

mutate()の概要

mutate()は、列の作成、変更、削除するための関数です。mutate()は、既存の変数の関数である新しい列を作成します。また、名前が既存の列と同じ場合は列を変更したり 、値をNULLに設定することで列を削除したりすることもできます。

mutate()の使い方

dplyr::mutate()の使い方は次になります。


mutate(
  .data,
  ...,
  .by = NULL,
  .keep = c("all", "used", "unused", "none"),
  .before = NULL,
  .after = NULL
)

mutate()の引数の意味

.data

データフレームまたはデータフレーム拡張(例:tibble)、遅延データフレーム(例:dbplyrまたはdtplyrから)を指定します。

列名と値のペアを指定します。
値によって、次のように動作します。

  • 値が1つのみのときには、すべての行でその値となります
  • 値がベクトルかつデータフレームの行数と等しいときには、その値となります
  • 値がNULLのときには、指定した列を削除します
  • 値がデータフレームまたはtibbleのときには、複数の列として展開されます
.by = NULL

実験的な引数です。
オプションで、この操作のみでグループ化する列の選択を指定します。
group_by()の代替として機能します。詳細と例については、?dplyr_byを参照してください。

.keep = c(“all”, “used”, “unused”, “none”)

.dataのどの列を出力に保持するかを制御します。
グループ化列と…によって作成された列は常に保持されます。

  • all(デフォルト): .data のすべての列を保持します。
  • used: …で新しい列を作成するために使用された列のみを保持します。これは入力と出力を並べて表示するため、作業を確認するのに便利です。
  • unused: … で新しい列を作成するために使用されていない列のみを保持します。これは新しい列を生成したが、その生成に使用された列が不要になった場合に便利です。
  • none: .dataから余分な列を保持しません。グループ化変数と…によって作成された列のみが保持されます。
.before = NULL

オプションで、新しい列が表示される場所を制御します (デフォルトでは右側に追加されます)。
詳細についてはrelocate()を参照してください。

.after = NULL

オプションで、新しい列が表示される場所を制御します (デフォルトでは右側に追加されます)。
詳細についてはrelocate()を参照してください。

準備

あらかじめ、tidyverseパッケージを読み込んでおきます。


library(tidyverse)

解説のために、次のirisデータセットを使用します。


iris |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

列の追加

irisデータセットで、列Sepal.Lengthを標準化した列normalized_Sepal.Lengthを追加するには次のようにします。


iris |>
  mutate(normalized_Sepal.Length = scale(Sepal.Length)) |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species normalized_Sepal.Length
1          5.1         3.5          1.4         0.2  setosa              -0.8976739
2          4.9         3.0          1.4         0.2  setosa              -1.1392005
3          4.7         3.2          1.3         0.2  setosa              -1.3807271
4          4.6         3.1          1.5         0.2  setosa              -1.5014904
5          5.0         3.6          1.4         0.2  setosa              -1.0184372
6          5.4         3.9          1.7         0.4  setosa              -0.5353840

irisデータセットで、列Sepal.Lengthを標準化した列normalized_Sepal.Lengthと列Sepal.Widthを標準化した列normalized_Sepal.Widthを追加するには次のようにします。mutate()の引数には列名と値のペアを「,」区切りで複数記載することができます。


iris |>
  mutate(normalized_Sepal.Length = scale(Sepal.Length),
         normalized_Sepal.Width = scale(Sepal.Width)) |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species normalized_Sepal.Length normalized_Sepal.Width
1          5.1         3.5          1.4         0.2  setosa              -0.8976739             1.01560199
2          4.9         3.0          1.4         0.2  setosa              -1.1392005            -0.13153881
3          4.7         3.2          1.3         0.2  setosa              -1.3807271             0.32731751
4          4.6         3.1          1.5         0.2  setosa              -1.5014904             0.09788935
5          5.0         3.6          1.4         0.2  setosa              -1.0184372             1.24503015
6          5.4         3.9          1.7         0.4  setosa              -0.5353840             1.93331463

列の変更

irisデータセットで、列Sepal.Lengthを標準化した値に変更するには次のようにします。


iris |>
  mutate(Sepal.Length = scale(Sepal.Length)) |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1   -0.8976739         3.5          1.4         0.2  setosa
2   -1.1392005         3.0          1.4         0.2  setosa
3   -1.3807271         3.2          1.3         0.2  setosa
4   -1.5014904         3.1          1.5         0.2  setosa
5   -1.0184372         3.6          1.4         0.2  setosa
6   -0.5353840         3.9          1.7         0.4  setosa

irisデータセットで、列Sepal.Lengthと列Sepal.Widthを同時に標準化するには次のようにします。mutate()の引数には列名と値のペアを「,」区切りで複数記載することができます。


iris |>
  mutate(Sepal.Length = scale(Sepal.Length),
         Sepal.Width = scale(Sepal.Width)) |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1   -0.8976739  1.01560199          1.4         0.2  setosa
2   -1.1392005 -0.13153881          1.4         0.2  setosa
3   -1.3807271  0.32731751          1.3         0.2  setosa
4   -1.5014904  0.09788935          1.5         0.2  setosa
5   -1.0184372  1.24503015          1.4         0.2  setosa
6   -0.5353840  1.93331463          1.7         0.4  setosa

列の削除

irisデータセットで、列Speciesを削除するには次のようにします。


iris |>
  mutate(Species = NULL) |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width
1          5.1         3.5          1.4         0.2
2          4.9         3.0          1.4         0.2
3          4.7         3.2          1.3         0.2
4          4.6         3.1          1.5         0.2
5          5.0         3.6          1.4         0.2
6          5.4         3.9          1.7         0.4

irisデータセットで、列Petal.Widthと列Speciesを削除するには次のようにします。mutate()の引数には列名と値のペアを「,」区切りで複数記載することができます。


iris |>
  mutate(Petal.Width = NULL,
         Species = NULL) |>
  head()

  Sepal.Length Sepal.Width Petal.Length
1          5.1         3.5          1.4
2          4.9         3.0          1.4
3          4.7         3.2          1.3
4          4.6         3.1          1.5
5          5.0         3.6          1.4
6          5.4         3.9          1.7
R入門 データフレームに列を追加する方法