DS講座 tidyverse tidyverse講座

【R前処理講座16】{dplyr} mutate:列の追加【tidyverse】

こんにちは,shun(@datasciencemore)です!
今回はmutateについて解説していきます.
mutateは列を追加するんでしたね.

こちらについても単純なようですが意外と奥が深いので,じっくり見ていきましょう.

今回のデータは,diamondsを使用します.

 

1.基本

mutateは,次のように使います.

データフレーム %>%
  mutate(列名1 = ベクトル1, 列名2 = ベクトル2)

このコードを実行すると,元のデータフレームの右側に列名1とベクトル1,列名2とベクトル2が図のように追加されます.

ポイントは,指定するベクトルの長さが元のデータフレームの行数と一致させていれば,どんなベクトルでも格納できることです.
よって,単に数値や文字列を追加するだけでなく,元のデータフレームのデータ(以降,元データと呼ぶ.)をいろいろ加工したベクトルを追加することも可能です.

2.定数の追加

元データにnew列を追加して,その中に文字列の"test"を入れてみましょう.

無事に一番右端にnew列が追加できていることが確認できました.

あれ?? 指定するベクトルの長さは元のデータフレームの行数と同じでなくてはいけないのでは?? 今回の例だと,"test"と長さ1なのに問題ないんですか??
おっ,するどい,いい質問です!! 以前学んだベクトルのリサイクル機能は覚えていますでしょうか??
【R前処理講座6】ベクトル【baseR】

こんにちは,shun(@datasciencemore)です!! 前回はデータ型についてやりましたね,覚えているでしょうか?今回はベクトルについてやっていきます.前回のデータ型がわからないとよく理解で ...

続きを見る

指定したベクトルの長さがデータフレームの行数より少ないとこのリサイクル機能を使用して,データフレームの行数に合わせてくれます. 今回の場合は,指定したのは"test"という長さ1の文字列なのですが,このリサイクルの機能により,"test"がデータフレームの行数に自動的に合わせてくれたのです. このリサイクル機能,便利といえば便利なのですが,時々想定外の挙動をするので,気をつけてくださいね. まぁ,今回のようにただ定数を指定するだけであれば,さほど心配する必要はないので,積極的に使用していきましょう!

3.元データの加工

元データを加工して,さまざまなベクトルに変形することができます. 例えば,元データにnew列を追加して,その中にdepth列を2倍にした値とtable列を5倍にした値を足した値を入れることを考えましょう. (この計算式に深い意味はありません笑)

new列が無事に追加できました.
値も想定どおりですね.
こんな感じで

元データをいじって,新たなベクトルを作成してそれを追加する

ということがmutateを使うと簡単にできます!!

4.条件ごとの列追加

実務では,条件ごとに処理を変えたいことが頻発します.
例えば,

この列の数値が10以上だったら処理1を,10未満だったら処理2を実施する.

みたいな感じです.

これもmutateを使用するとスッキリ書くことができます.
単数条件と複数条件の場合で書き方が違うので,両方とも見ていきましょう.
※ちなみに単数条件ってのは1つの条件で複数条件ってのは2つ以上の条件のことを言っています.
言葉だとよくわからないかもしれないので,具体例を見てみましょう.
今回は,diamondsのcolor列の値によって,処理を変えてみましょう.
color列は,7種類(E,I,J,H,F,G,D)のいずれかが入っています.
※ちなみにこれは,distinctという関数を使用することで確認できます.

 

4.1.単数条件 if_else

さて,まずは単数条件から見ていきましょう.
単数条件は,if_else関数を使うと簡潔に書くことができます.
if_else関数のイメージはこんな感じです.

具体例として, 新しい列をnew列とし,

color列が"E" ⇒ "E"をnew列に追加
それ以外 ⇒ "not E"をnew列に追加

という処理を実施してみましょう.

お見事!
見事に一番右端にnew列が追加されています.
こんな感じで単数条件の場合は,if_else関数を使うと,条件ごとに処理を分岐させることができるのです.

4.2.複数条件 case_when

単数条件については,if_else関数を使用すればいいと上で書きました.
それでは,複数条件の場合はどのように書くのでしょうか?
if_elseを複数回使用しても書けるですが,case_when関数を使用するともっときれいに書くことができます.
case_when関数のイメージはこんな感じ.

if_elseと比べると条件が増えているのがわかります.

具体例として,新しい列をnew列とし,

color列が"E" ⇒ "E"をnew列に追加
color列が"I" ⇒ "I"をnew列に追加
それ以外 ⇒ "not_E"をnew列に追加

という処理を実施してみましょう.

ちゃんと右側にnew列ができていますね,めでたしめでたし!

 

まとめ

今回はmutateについて,学習しました.

  • mutateを使えば,列を追加することができる.
  • 条件ごとに処理を変更させたい場合は,if_else(単数条件)やcase_when(複数条件)を使うと簡潔に書ける.

こんなところですかね.

mutateを使いこなせるとすごく便利ですよ.
ぜひいろいろ試してみてくださいね!!

それじゃ,お疲れ様でした!!

-DS講座, tidyverse, tidyverse講座